blob: c7caeb2ab1481489e69c62dc8b2079155f479e74 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.royale.compiler.internal.scopes;
import java.util.Collection;
import org.apache.royale.compiler.definitions.IDefinition;
import org.apache.royale.compiler.scopes.IDefinitionSet;
/**
* An {@code IDefinitionStore} is used by a scope to store a collection
* of definitions, organized into sets of definition sthat have the same
* base name.
* <p>
* The {@code IDefinitionStore} is completely private to the scope
* and is not exposed by any scope APIs.
* <p>
* Since many scopes contain only a few definitions, there are multiple
* implementations of this interface, optimized for storing 0, 1, 2, 4, 8,
* and an unlimited number of definitions.
*/
public interface IDefinitionStore
{
/**
* Gets the maximum number of definition sets that this
* definition store can hold.
*
* @return The maximum number of definition sets.
*/
int getCapacity();
/**
* Creates another definition store with a greater capacity.
* <p>
* When a call to {@link #add}() on this store returns <code>false</code>
* (because the store has reached its capacity), call this method
* to create a larger store and then call <code>add()</code>) on it.
* The second <code>add()</code> is guaranteed to succeed.
*
* @return An {@link IDefinitionStore} with a greater capacity.
*/
IDefinitionStore createLargerStore();
/**
* Adds a definition to this store.
*
* @param definition The {@link IDefinition} to add.
* @return A flag indicating whether the definition was added. It may not be
* possible to add the definition because some implementations of
* {@link IDefinitionStore} have limited storage capacity, as a memory
* optimization.
*/
boolean add(IDefinition definition);
/**
* Removes a definition from this store.
*
* @param definition The {@link IDefinition} to remove.
* @return A flag indicating whether the definition was found.
*/
boolean remove(IDefinition definition);
/**
* Gets the set of definitions in this store that have a specified base name.
* <p>
* This method is called very frequently as part of name resolution.
* All implementations should be fast and avoid creating temporary objects.
*
* @param baseName The base name of the definitions you want to retrieve
* from the store.
* @return An {@link IDefinitionSet} containing the definition with that
* base name, or <code>null</code> if there are none.
*/
IDefinitionSet getDefinitionSetByName(String baseName);
/**
* Puts a specified set of definitions with a specified base name
* into this store.
* <p>
* This is only used when a project scope has to replace a definition set
* in its store because it has converted definition promises in the
* set to actual definitions.
*
* @param baseName The base name of the definitions in the set.
* @param set The {@link IDefinitionSet} of definitions to put
* into the store.
*/
void putDefinitionSetByName(String baseName, IDefinitionSet set);
/**
* Gets the base names of all the definition sets in this store.
*
* @return An unordered collection of Strings for the base names.
*/
Collection<String> getAllNames();
/**
* Gets all the definitions sets in this store.
*
* @return An unordered collection of {@link IDefinitionSet} objects.
*/
Collection<IDefinitionSet> getAllDefinitionSets();
/**
* Gets all the definitions in this store.
*
* @return An ordered collection of {@link IDefinition} objects.
*/
Collection<IDefinition> getAllDefinitions();
}