package com.github.sommeri.less4j.core.compiler.scopes;
import java.util.List;
import com.github.sommeri.less4j.core.ast.ASTCssNode;
import com.github.sommeri.less4j.core.ast.AbstractVariableDeclaration;
import com.github.sommeri.less4j.core.ast.Expression;
import com.github.sommeri.less4j.core.ast.ReusableStructure;
import com.github.sommeri.less4j.core.ast.ReusableStructureName;
import com.github.sommeri.less4j.core.ast.Variable;
import com.github.sommeri.less4j.core.compiler.expressions.ExpressionFilter;
import com.github.sommeri.less4j.core.compiler.scopes.local.LocalScopeData;
import com.github.sommeri.less4j.core.compiler.scopes.local.MixinsDefinitionsStorage;
import com.github.sommeri.less4j.core.compiler.scopes.local.MixinsDefinitionsStorage.MixinsPlaceholder;
import com.github.sommeri.less4j.core.compiler.scopes.local.VariablesDeclarationsStorage;
import com.github.sommeri.less4j.core.compiler.scopes.local.VariablesDeclarationsStorage.VariablesPlaceholder;
public interface ILocalScope {
// names
public void addNames(List<String> names);
public List<String> getNames();
// scope description
public ASTCssNode getOwner();
public String getType();
public boolean isBodyOwnerScope();
public boolean hasTheSameLocalData(ILocalScope otherScope);
public boolean isPresentInAst();
public void removedFromAst();
// placeholders for data from references
public DataPlaceholder createDataPlaceholder();
public void addToDataPlaceholder(IScope otherScope);
public void replacePlaceholder(DataPlaceholder placeholder, IScope otherScope);
public void closeDataPlaceholder();
// snapshots for temporary evalution that does not require tree change
public void createCurrentDataSnapshot();
public void createOriginalDataSnapshot();
public void discardLastDataSnapshot();
public ILocalScope cloneCurrentDataSnapshot();
// variables
public void registerVariable(AbstractVariableDeclaration declaration);
public void registerVariable(AbstractVariableDeclaration node, Expression replacementValue);
public void registerVariableIfNotPresent(String name, Expression replacementValue);
public void registerVariable(String name, Expression replacementValue);
public void addFilteredVariables(ExpressionFilter filter, IScope source);
public Expression getValue(Variable variable);
public Expression getValue(String name);
// mixins
public void registerMixin(ReusableStructure mixin, IScope mixinsBodyScope);
public void addAllMixins(List<FullMixinDefinition> mixins);
public List<FullMixinDefinition> getAllMixins();
public List<FullMixinDefinition> getMixinsByName(List<String> nameChain, ReusableStructureName name);
public List<FullMixinDefinition> getMixinsByName(ReusableStructureName name);
public List<FullMixinDefinition> getMixinsByName(String name);
// other scopes and internals - these could be removed with proper refactoring. It would be technically cleaner, but it does not seem to be too important rigth now
public void add(IScope otherSope);
public MixinsDefinitionsStorage getLocalMixins();
public VariablesDeclarationsStorage getLocalVariables();
public LocalScopeData getLocalData();
public static final class DataPlaceholder {
private VariablesPlaceholder variablesPlaceholder;
private MixinsPlaceholder mixinsPlaceholder;
public DataPlaceholder(VariablesPlaceholder variablesPlaceholder, MixinsPlaceholder mixinsPlaceholder) {
this.variablesPlaceholder = variablesPlaceholder;
this.mixinsPlaceholder = mixinsPlaceholder;
}
public VariablesPlaceholder getVariablesPlaceholder() {
return variablesPlaceholder;
}
public MixinsPlaceholder getMixinsPlaceholder() {
return mixinsPlaceholder;
}
}
}