package me.tomassetti.turin.resolvers;
import me.tomassetti.jvm.JvmMethodDefinition;
import me.tomassetti.turin.definitions.ContextDefinition;
import me.tomassetti.turin.definitions.TypeDefinition;
import me.tomassetti.turin.parser.ast.*;
import me.tomassetti.turin.parser.ast.expressions.FunctionCall;
import me.tomassetti.turin.parser.ast.properties.PropertyDefinition;
import me.tomassetti.turin.parser.ast.properties.PropertyReference;
import me.tomassetti.turin.symbols.Symbol;
import me.tomassetti.turin.typesystem.TypeUsage;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* Combine several resolvers.
*/
public class ComposedSymbolResolver implements SymbolResolver {
private List<SymbolResolver> elements = new ArrayList<>();
private SymbolResolver parent = null;
@Override
public SymbolResolver getParent() {
return parent;
}
@Override
public void setParent(SymbolResolver parent) {
this.parent = parent;
}
public ComposedSymbolResolver(List<SymbolResolver> elements) {
this.elements = elements;
this.elements.forEach((e)->e.setParent(ComposedSymbolResolver.this));
}
@Override
public Optional<PropertyDefinition> findDefinition(PropertyReference propertyReference) {
for (SymbolResolver element : elements) {
Optional<PropertyDefinition> definition = element.findDefinition(propertyReference);
if (definition.isPresent()) {
return definition;
}
}
return Optional.empty();
}
@Override
public Optional<TypeDefinition> findTypeDefinitionIn(String typeName, Node context, SymbolResolver resolver) {
for (SymbolResolver element : elements) {
Optional<TypeDefinition> definition = element.findTypeDefinitionIn(typeName, context, resolver);
if (definition.isPresent()) {
return definition;
}
}
return Optional.empty();
}
@Override
public Optional<TypeUsage> findTypeUsageIn(String typeName, Node context, SymbolResolver resolver) {
for (SymbolResolver element : elements) {
Optional<TypeUsage> typeUsage = element.findTypeUsageIn(typeName, context, resolver);
if (typeUsage.isPresent()) {
return typeUsage;
}
}
return Optional.empty();
}
@Override
public Optional<JvmMethodDefinition> findJvmDefinition(FunctionCall functionCall) {
for (SymbolResolver element : elements) {
Optional<JvmMethodDefinition> partial = element.findJvmDefinition(functionCall);
if (partial.isPresent()) {
return partial;
}
}
return Optional.empty();
}
@Override
public Optional<Symbol> findSymbol(String name, Node context) {
for (SymbolResolver element : elements) {
Optional<Symbol> res = element.findSymbol(name, context);
if (res.isPresent()) {
return res;
}
}
return Optional.empty();
}
@Override
public boolean existPackage(String packageName) {
for (SymbolResolver element : elements) {
if (element.existPackage(packageName)) {
return true;
}
}
return false;
}
@Override
public Optional<ContextDefinition> findContextSymbol(String contextName, Node context) {
for (SymbolResolver element : elements) {
Optional<ContextDefinition> res = element.findContextSymbol(contextName, context);
if (res.isPresent()) {
return res;
}
}
return Optional.empty();
}
}