/* * #%~ * The VDM Type Checker * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.typechecker.assistant; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.overture.ast.analysis.AnalysisAdaptor; import org.overture.ast.analysis.AnswerAdaptor; import org.overture.ast.analysis.intf.IAnswer; import org.overture.ast.analysis.intf.IQuestion; import org.overture.ast.analysis.intf.IQuestionAnswer; import org.overture.ast.assistant.AstAssistantFactory; import org.overture.ast.assistant.pattern.PTypeList; import org.overture.ast.definitions.PDefinition; import org.overture.ast.intf.lex.ILexNameToken; import org.overture.ast.lex.LexNameList; import org.overture.ast.modules.AModuleModules; import org.overture.ast.patterns.PMultipleBind; import org.overture.ast.types.AAccessSpecifierAccessSpecifier; import org.overture.ast.types.AClassType; import org.overture.ast.types.AFunctionType; import org.overture.ast.types.AOperationType; import org.overture.ast.types.AProductType; import org.overture.ast.types.ARecordInvariantType; import org.overture.ast.types.SSetType; import org.overture.ast.types.AUnionType; import org.overture.ast.types.PType; import org.overture.ast.types.SMapType; import org.overture.ast.types.SSeqType; import org.overture.ast.util.PTypeSet; import org.overture.typechecker.Environment; import org.overture.typechecker.LexNameTokenAssistant; import org.overture.typechecker.TypeCheckInfo; import org.overture.typechecker.TypeComparator; import org.overture.typechecker.assistant.definition.AExplicitFunctionDefinitionAssistantTC; import org.overture.typechecker.assistant.definition.AExplicitOperationDefinitionAssistantTC; import org.overture.typechecker.assistant.definition.AImplicitFunctionDefinitionAssistantTC; import org.overture.typechecker.assistant.definition.AImplicitOperationDefinitionAssistantTC; import org.overture.typechecker.assistant.definition.PAccessSpecifierAssistantTC; import org.overture.typechecker.assistant.definition.PDefinitionAssistantTC; import org.overture.typechecker.assistant.definition.PDefinitionListAssistantTC; import org.overture.typechecker.assistant.definition.PDefinitionSet; import org.overture.typechecker.assistant.definition.SClassDefinitionAssistantTC; import org.overture.typechecker.assistant.definition.SFunctionDefinitionAssistantTC; import org.overture.typechecker.assistant.module.AModuleExportsAssistantTC; import org.overture.typechecker.assistant.module.AModuleImportsAssistantTC; import org.overture.typechecker.assistant.module.AModuleModulesAssistantTC; import org.overture.typechecker.assistant.pattern.APatternTypePairAssistant; import org.overture.typechecker.assistant.pattern.ATypeBindAssistantTC; import org.overture.typechecker.assistant.pattern.PBindAssistantTC; import org.overture.typechecker.assistant.pattern.PMultipleBindAssistantTC; import org.overture.typechecker.assistant.pattern.PPatternAssistantTC; import org.overture.typechecker.assistant.pattern.PPatternListAssistantTC; import org.overture.typechecker.assistant.pattern.PatternListTC; import org.overture.typechecker.assistant.type.AClassTypeAssistantTC; import org.overture.typechecker.assistant.type.AFunctionTypeAssistantTC; import org.overture.typechecker.assistant.type.AOperationTypeAssistantTC; import org.overture.typechecker.assistant.type.ARecordInvariantTypeAssistantTC; import org.overture.typechecker.assistant.type.PTypeAssistantTC; import org.overture.typechecker.utilities.CallableOperationChecker; import org.overture.typechecker.utilities.ComposeTypeCollector; import org.overture.typechecker.utilities.DefinitionCollector; import org.overture.typechecker.utilities.DefinitionEqualityChecker; import org.overture.typechecker.utilities.DefinitionFinder; import org.overture.typechecker.utilities.DefinitionFinder.Newquestion; import org.overture.typechecker.utilities.DefinitionTypeFinder; import org.overture.typechecker.utilities.DefinitionTypeResolver; import org.overture.typechecker.utilities.DefinitionTypeResolver.NewQuestion; import org.overture.typechecker.utilities.Dereferer; import org.overture.typechecker.utilities.ExitTypeCollector; import org.overture.typechecker.utilities.FunctionChecker; import org.overture.typechecker.utilities.ImplicitDefinitionFinder; import org.overture.typechecker.utilities.InstanceVariableChecker; import org.overture.typechecker.utilities.KindFinder; import org.overture.typechecker.utilities.NameFinder; import org.overture.typechecker.utilities.OperationChecker; import org.overture.typechecker.utilities.PTypeFunctionChecker; import org.overture.typechecker.utilities.SelfDefinitionFinder; import org.overture.typechecker.utilities.UnusedChecker; import org.overture.typechecker.utilities.UpdatableChecker; import org.overture.typechecker.utilities.UsedChecker; import org.overture.typechecker.utilities.UsedMarker; import org.overture.typechecker.utilities.VariableNameCollector; import org.overture.typechecker.utilities.expression.ExportDefinitionFinder; import org.overture.typechecker.utilities.expression.ExportDefinitionListFinder; import org.overture.typechecker.utilities.expression.ImportDefinitionFinder; import org.overture.typechecker.utilities.expression.PreNameFinder; import org.overture.typechecker.utilities.pattern.AllDefinitionLocator; import org.overture.typechecker.utilities.pattern.AlwaysMatchingPatternChecker; import org.overture.typechecker.utilities.pattern.MultipleBindLister; import org.overture.typechecker.utilities.pattern.PatternResolver; import org.overture.typechecker.utilities.pattern.PatternUnresolver; import org.overture.typechecker.utilities.pattern.PossibleBindTypeFinder; import org.overture.typechecker.utilities.pattern.PossibleTypeFinder; import org.overture.typechecker.utilities.pattern.SimplePatternChecker; import org.overture.typechecker.utilities.type.ClassBasisChecker; import org.overture.typechecker.utilities.type.ClassTypeFinder; import org.overture.typechecker.utilities.type.ConcreateTypeImplementor; import org.overture.typechecker.utilities.type.FunctionTypeFinder; import org.overture.typechecker.utilities.type.MapBasisChecker; import org.overture.typechecker.utilities.type.MapTypeFinder; import org.overture.typechecker.utilities.type.NarrowerThanComparator; import org.overture.typechecker.utilities.type.OperationBasisChecker; import org.overture.typechecker.utilities.type.OperationTypeFinder; import org.overture.typechecker.utilities.type.PTypeExtendedChecker; import org.overture.typechecker.utilities.type.PTypeFinder; import org.overture.typechecker.utilities.type.PTypeResolver; import org.overture.typechecker.utilities.type.ProductBasisChecker; import org.overture.typechecker.utilities.type.ProductExtendedChecker; import org.overture.typechecker.utilities.type.ProductExtendedTypeFinder; import org.overture.typechecker.utilities.type.ProductTypeFinder; import org.overture.typechecker.utilities.type.QualifiedDefinition; import org.overture.typechecker.utilities.type.RecordBasisChecker; import org.overture.typechecker.utilities.type.RecordTypeFinder; import org.overture.typechecker.utilities.type.SeqBasisChecker; import org.overture.typechecker.utilities.type.SeqTypeFinder; import org.overture.typechecker.utilities.type.SetBasisChecker; import org.overture.typechecker.utilities.type.SetTypeFinder; import org.overture.typechecker.utilities.type.TagBasisChecker; import org.overture.typechecker.utilities.type.TypeDisplayer; import org.overture.typechecker.utilities.type.TypeEqualityChecker; import org.overture.typechecker.utilities.type.TypeUnresolver; import org.overture.typechecker.utilities.type.UnionBasisChecker; import org.overture.typechecker.utilities.type.UnionTypeFinder; import org.overture.typechecker.utilities.type.VoidBasisChecker; import org.overture.typechecker.utilities.type.VoidExistanceChecker; import org.overture.typechecker.visitor.QualificationVisitor; //TODO Add assistant Javadoc /** * An assistant factory for the Overture Typecher. The methods supplied here only support pure VDM nodes. * Override/extend as needed. * * @author ldc */ public class TypeCheckerAssistantFactory extends AstAssistantFactory implements ITypeCheckerAssistantFactory { // instance variables of things to return transient TypeComparator typeComp; transient LexNameTokenAssistant lnt; transient SFunctionDefinitionAssistantTC sfd; // @Override // public AApplyObjectDesignatorAssistantTC createAApplyObjectDesignatorAssistant() // { // return new AApplyObjectDesignatorAssistantTC(this); // } // @Override // public ABracketTypeAssistantTC createABracketTypeAssistant() // { // return new ABracketTypeAssistantTC(this); // } @Override public AClassTypeAssistantTC createAClassTypeAssistant() { return new AClassTypeAssistantTC(this); } @Override public AFunctionTypeAssistantTC createAFunctionTypeAssistant() { return new AFunctionTypeAssistantTC(this); } @Override public AOperationTypeAssistantTC createAOperationTypeAssistant() { return new AOperationTypeAssistantTC(this); } // @Override // public APatternListTypePairAssistantTC createAPatternListTypePairAssistant() // { // return new APatternListTypePairAssistantTC(this); // } @Override public ARecordInvariantTypeAssistantTC createARecordInvariantTypeAssistant() { return new ARecordInvariantTypeAssistantTC(this); } // @Override // public AUnionTypeAssistantTC createAUnionTypeAssistant() // { // return new AUnionTypeAssistantTC(this); // } @Override public PTypeAssistantTC createPTypeAssistant() { return new PTypeAssistantTC(this); } // definition // @Override // public AAssignmentDefinitionAssistantTC createAAssignmentDefinitionAssistant() // { // return new AAssignmentDefinitionAssistantTC(this); // } // @Override // public ABusClassDefinitionAssistantTC createABusClassDefinitionAssistant() // { // return new ABusClassDefinitionAssistantTC(this); // } // @Override // public ACpuClassDefinitionAssistantTC createACpuClassDefinitionAssistant() // { // return new ACpuClassDefinitionAssistantTC(this); // } @Override public AExplicitFunctionDefinitionAssistantTC createAExplicitFunctionDefinitionAssistant() { return new AExplicitFunctionDefinitionAssistantTC(this); } @Override public AExplicitOperationDefinitionAssistantTC createAExplicitOperationDefinitionAssistant() { return new AExplicitOperationDefinitionAssistantTC(this); } @Override public AImplicitFunctionDefinitionAssistantTC createAImplicitFunctionDefinitionAssistant() { return new AImplicitFunctionDefinitionAssistantTC(this); } @Override public AImplicitOperationDefinitionAssistantTC createAImplicitOperationDefinitionAssistant() { return new AImplicitOperationDefinitionAssistantTC(this); } // @Override // public AImportedDefinitionAssistantTC createAImportedDefinitionAssistant() // { // return new AImportedDefinitionAssistantTC(this); // } // @Override // public AInstanceVariableDefinitionAssistantTC createAInstanceVariableDefinitionAssistant() // { // return new AInstanceVariableDefinitionAssistantTC(this); // } // @Override // public ALocalDefinitionAssistantTC createALocalDefinitionAssistant() // { // return new ALocalDefinitionAssistantTC(this); // } // @Override // public AStateDefinitionAssistantTC createAStateDefinitionAssistant() // { // return new AStateDefinitionAssistantTC(this); // } // @Override // public ASystemClassDefinitionAssistantTC createASystemClassDefinitionAssistant() // { // return new ASystemClassDefinitionAssistantTC(this); // } // @Override // public AThreadDefinitionAssistantTC createAThreadDefinitionAssistant() // { // return new AThreadDefinitionAssistantTC(this); // } // @Override // public ATypeDefinitionAssistantTC createATypeDefinitionAssistant() // { // return new ATypeDefinitionAssistantTC(this); // } // @Override // public AValueDefinitionAssistantTC createAValueDefinitionAssistant() // { // return new AValueDefinitionAssistantTC(this); // } @Override public PAccessSpecifierAssistantTC createPAccessSpecifierAssistant() { return new PAccessSpecifierAssistantTC(this); } @Override public PDefinitionAssistantTC createPDefinitionAssistant() { return new PDefinitionAssistantTC(this); } @Override public PDefinitionListAssistantTC createPDefinitionListAssistant() { return new PDefinitionListAssistantTC(this); } @Override public PDefinitionSet createPDefinitionSet() { return new PDefinitionSet(this); } // @Override // public PTraceDefinitionAssistantTC createPTraceDefinitionAssistant() // { // return new PTraceDefinitionAssistantTC(this); // } @Override public SClassDefinitionAssistantTC createSClassDefinitionAssistant() { return new SClassDefinitionAssistantTC(this); } // expression // @Override // public AApplyExpAssistantTC createAApplyExpAssistant() // { // return new AApplyExpAssistantTC(this); // } // @Override // public ACaseAlternativeAssistantTC createACaseAlternativeAssistant() // { // return new ACaseAlternativeAssistantTC(this); // } // @Override // public PExpAssistantTC createPExpAssistant() // { // return new PExpAssistantTC(this); // } // @Override // public SBinaryExpAssistantTC createSBinaryExpAssistant() // { // return new SBinaryExpAssistantTC(this); // } // module // @Override // public AFromModuleImportsAssistantTC createAFromModuleImportsAssistant() // { // return new AFromModuleImportsAssistantTC(this); // } @Override public AModuleExportsAssistantTC createAModuleExportsAssistant() { return new AModuleExportsAssistantTC(this); } @Override public AModuleImportsAssistantTC createAModuleImportsAssistant() { return new AModuleImportsAssistantTC(this); } @Override public AModuleModulesAssistantTC createAModuleModulesAssistant() { return new AModuleModulesAssistantTC(this); } // @Override // public PExportAssistantTC createPExportAssistant() // { // return new PExportAssistantTC(this); // } // @Override // public PImportAssistantTC createPImportAssistant() // { // return new PImportAssistantTC(this); // } // pattern // @Override // public ABooleanPatternAssistantTC createABooleanPatternAssistant() // { // return new ABooleanPatternAssistantTC(this); // } // @Override // public ACharacterPatternAssistantTC createACharacterPatternAssistant() // { // return new ACharacterPatternAssistantTC(this); // } // @Override // public AConcatenationPatternAssistantTC createAConcatenationPatternAssistant() // { // return new AConcatenationPatternAssistantTC(this); // } // // @Override // public AExpressionPatternAssistantTC createAExpressionPatternAssistant() // { // return new AExpressionPatternAssistantTC(this); // } // @Override // public AMapletPatternMapletAssistantTC createAMapletPatternMapletAssistant() // { // return new AMapletPatternMapletAssistantTC(this); // } // @Override // public AMapPatternAssistantTC createAMapPatternAssistant() // { // return new AMapPatternAssistantTC(this); // } // @Override // public AMapUnionPatternAssistantTC createAMapUnionPatternAssistant() // { // return new AMapUnionPatternAssistantTC(this); // } @Override public APatternTypePairAssistant createAPatternTypePairAssistant() { return new APatternTypePairAssistant(this); } // @Override // public ARecordPatternAssistantTC createARecordPatternAssistant() // { // return new ARecordPatternAssistantTC(this); // } // @Override // public ASeqPatternAssistantTC createASeqPatternAssistant() // { // return new ASeqPatternAssistantTC(this); // } // @Override // public ASetBindAssistantTC createASetBindAssistant() // { // return new ASetBindAssistantTC(this); // } // @Override // public ASetPatternAssistantTC createASetPatternAssistant() // { // return new ASetPatternAssistantTC(this); // } // @Override // public ATuplePatternAssistantTC createATuplePatternAssistant() // { // return new ATuplePatternAssistantTC(this); // } @Override public ATypeBindAssistantTC createATypeBindAssistant() { return new ATypeBindAssistantTC(this); } // @Override // public AUnionPatternAssistantTC createAUnionPatternAssistant() // { // return new AUnionPatternAssistantTC(this); // } @Override public PatternListTC createPatternList() { return new PatternListTC(this); } @Override public PBindAssistantTC createPBindAssistant() { return new PBindAssistantTC(this); } @Override public PMultipleBindAssistantTC createPMultipleBindAssistant() { return new PMultipleBindAssistantTC(this); } @Override public PPatternAssistantTC createPPatternAssistant() { return new PPatternAssistantTC(this); } // @Override // public PPatternBindAssistantTC createPPatternBindAssistant() // { // return new PPatternBindAssistantTC(this); // } @Override public PPatternListAssistantTC createPPatternListAssistant() { return new PPatternListAssistantTC(this); } // statement // @Override // public AAlwaysStmAssistantTC createAAlwaysStmAssistant() // { // return new AAlwaysStmAssistantTC(this); // } // // @Override // public AAssignmentStmAssistantTC createAAssignmentStmAssistant() // { // return new AAssignmentStmAssistantTC(this); // } // @Override // public ABlockSimpleBlockStmAssistantTC createABlockSimpleBlockStmAssistant() // { // return new ABlockSimpleBlockStmAssistantTC(this); // } // @Override // public ACallObjectStatementAssistantTC createACallObjectStatementAssistant() // { // return new ACallObjectStatementAssistantTC(this); // } // @Override // public ACallStmAssistantTC createACallStmAssistant() // { // return new ACallStmAssistantTC(this); // } // @Override // public ACaseAlternativeStmAssistantTC createACaseAlternativeStmAssistant() // { // return new ACaseAlternativeStmAssistantTC(this); // } // // @Override // public ACasesStmAssistantTC createACasesStmAssistant() // { // return new ACasesStmAssistantTC(this); // } // // @Override // public AElseIfStmAssistantTC createAElseIfStmAssistant() // { // return new AElseIfStmAssistantTC(this); // } // // @Override // public AExitStmAssistantTC createAExitStmAssistant() // { // return new AExitStmAssistantTC(this); // } // @Override // public AExternalClauseAssistantTC createAExternalClauseAssistant() // { // return new AExternalClauseAssistantTC(this); // } // @Override // public AForAllStmAssistantTC createAForAllStmAssistant() // { // return new AForAllStmAssistantTC(this); // } // // @Override // public AForIndexStmAssistantTC createAForIndexStmAssistant() // { // return new AForIndexStmAssistantTC(this); // } // @Override // public AForPatternBindStmAssitantTC createAForPatternBindStmAssitant() // { // return new AForPatternBindStmAssitantTC(this); // } // // @Override // public AIfStmAssistantTC createAIfStmAssistant() // { // return new AIfStmAssistantTC(this); // } // // @Override // public ALetBeStStmAssistantTC createALetBeStStmAssistant() // { // return new ALetBeStStmAssistantTC(this); // } // @Override // public ANonDeterministicSimpleBlockStmAssistantTC createANonDeterministicSimpleBlockStmAssistant() // { // return new ANonDeterministicSimpleBlockStmAssistantTC(this); // } // @Override // public AReturnStmAssistantTC createAReturnStmAssistant() // { // return new AReturnStmAssistantTC(this); // } // // @Override // public ATixeStmAssistantTC createATixeStmAssistant() // { // return new ATixeStmAssistantTC(this); // } // @Override // public ATrapStmAssistantTC createATrapStmAssistant() // { // return new ATrapStmAssistantTC(this); // } // // @Override // public AWhileStmAssistantTC createAWhileStmAssistant() // { // return new AWhileStmAssistantTC(this); // } // @Override // public PStateDesignatorAssistantTC createPStateDesignatorAssistant() // { // return new PStateDesignatorAssistantTC(this); // } // @Override // public PStmAssistantTC createPStmAssistant() // { // return new PStmAssistantTC(this); // } // @Override // public SLetDefStmAssistantTC createSLetDefStmAssistant() // { // return new SLetDefStmAssistantTC(this); // } // // @Override // public SSimpleBlockStmAssistantTC createSSimpleBlockStmAssistant() // { // return new SSimpleBlockStmAssistantTC(this); // } /* New visitor utilities */ @Override public IAnswer<List<PDefinition>> getDefinitionCollector() { return new DefinitionCollector(this); } @Override public IAnswer<PType> getDefinitionTypeFinder() { return new DefinitionTypeFinder(this); } @Override public IQuestionAnswer<Object, Boolean> getDefinitionEqualityChecker() { return new DefinitionEqualityChecker(this); } @Override public IAnswer<LexNameList> getVariableNameCollector() { return new VariableNameCollector(this); } @Override public IAnswer<PDefinition> getSelfDefinitionFinder() { return new SelfDefinitionFinder(this); } @Override public IAnswer<PTypeSet> getExitTypeCollector() { return new ExitTypeCollector(this); } @Override public IQuestionAnswer<Newquestion, PDefinition> getDefinitionFinder() { return new DefinitionFinder(this); } @Override public IQuestionAnswer<NameFinder.Newquestion, PDefinition> getNameFinder() { return new NameFinder(this); } @Override public AnswerAdaptor<Boolean> getFunctionChecker() { return new FunctionChecker(this); } @Override public IAnswer<Boolean> getOperationChecker() { return new OperationChecker(this); } @Override public IAnswer<String> getKindFinder() { return new KindFinder(this); } @Override public IAnswer<Boolean> getUpdatableChecker() { return new UpdatableChecker(this); } @Override public IAnswer<Boolean> getCallableOperationChecker() { return new CallableOperationChecker(this); } @Override public AnalysisAdaptor getUsedMarker() { return new UsedMarker(this); } @Override public IQuestion<Environment> getImplicitDefinitionFinder() { return new ImplicitDefinitionFinder(this); } @Override public IAnswer<Boolean> getUsedChecker() { return new UsedChecker(this); } @Override public IAnswer<Boolean> getPTypeFunctionChecker() { return new PTypeFunctionChecker(this); } @Override public AnalysisAdaptor getUnusedChecker() { return new UnusedChecker(this); } @Override public IAnswer<PDefinition> getDereferer() { return new Dereferer(this); } @Override public IQuestion<NewQuestion> getDefinitionTypeResolver() { return new DefinitionTypeResolver(this); } @Override public AnswerAdaptor<Boolean> getMapBasisChecker() { return new MapBasisChecker(this); } @Override public IAnswer<SMapType> getMapTypeFinder() { return new MapTypeFinder(this); } @Override public IAnswer<SSeqType> getSeqTypeFinder() { return new SeqTypeFinder(this); } @Override public AnswerAdaptor<Boolean> getSeqBasisChecker() { return new SeqBasisChecker(this); } @Override public IAnswer<AOperationType> getOperationTypeFinder() { return new OperationTypeFinder(this); } @Override public AnswerAdaptor<Boolean> getOperationBasisChecker() { return new OperationBasisChecker(this); } @Override public AnswerAdaptor<Boolean> getSetBasisChecker() { return new SetBasisChecker(this); } @Override public IAnswer<SSetType> getSetTypeFinder() { return new SetTypeFinder(this); } @Override public AnswerAdaptor<Boolean> getRecordBasisChecker() { return new RecordBasisChecker(this); } @Override public AnswerAdaptor<Boolean> getTagBasisChecker() { return new TagBasisChecker(this); } @Override public IAnswer<ARecordInvariantType> getRecordTypeFinder() { return new RecordTypeFinder(this); } @Override public AnswerAdaptor<Boolean> getClassBasisChecker(Environment env) { return new ClassBasisChecker(this, env); } @Override public IAnswer<AClassType> getClassTypeFinder(Environment env) { return new ClassTypeFinder(this, env); } @Override public IAnswer<AProductType> getProductTypeFinder() { return new ProductTypeFinder(this); } @Override public AnswerAdaptor<Boolean> getProductBasisChecker() { return new ProductBasisChecker(this); } @Override public IAnswer<AUnionType> getUnionTypeFinder() { return new UnionTypeFinder(this); } @Override public IQuestionAnswer<Object, Boolean> getTypeEqualityChecker() { return new TypeEqualityChecker(this); } @Override public IAnswer<String> getTypeDisplayer() { return new TypeDisplayer(this); } @Override public AnalysisAdaptor getTypeUnresolver() { return new TypeUnresolver(this); } @Override public IQuestionAnswer<AAccessSpecifierAccessSpecifier, Boolean> getNarrowerThanComparator() { return new NarrowerThanComparator(this); } @Override public AnswerAdaptor<Boolean> getUnionBasisChecker() { return new UnionBasisChecker(this); } @Override public IAnswer<AFunctionType> getFunctionTypeFinder() { return new FunctionTypeFinder(this); } @Override public IQuestionAnswer<org.overture.typechecker.utilities.type.ConcreateTypeImplementor.Newquestion, PType> getConcreateTypeImplementor() { return new ConcreateTypeImplementor(this); } @Override public IQuestionAnswer<org.overture.typechecker.utilities.type.PTypeResolver.Newquestion, PType> getPTypeResolver() { return new PTypeResolver(this); } @Override public IQuestionAnswer<String, PType> getPTypeFinder() { return new PTypeFinder(this); } @Override public IQuestionAnswer<Integer, Boolean> getProductExtendedChecker() { return new ProductExtendedChecker(this); } @Override public IQuestionAnswer<Integer, AProductType> getProductExtendedTypeFinder() { return new ProductExtendedTypeFinder(this); } @Override public IQuestionAnswer<Class<? extends PType>, Boolean> getPTypeExtendedChecker() { return new PTypeExtendedChecker(this); } @Override public IAnswer<Boolean> getVoidExistanceChecker() { return new VoidExistanceChecker(this); } @Override public IAnswer<Boolean> getVoidBasisChecker() { return new VoidBasisChecker(this); } @Override public IAnswer<PType> getPossibleTypeFinder() { return new PossibleTypeFinder(this); } @Override public IAnswer<Boolean> getSimplePatternChecker() { return new SimplePatternChecker(this); } @Override public IAnswer<Boolean> getAlwaysMatchingPatternChecker() { return new AlwaysMatchingPatternChecker(this); } @Override public AnalysisAdaptor getPatternUnresolver() { return new PatternUnresolver(this); } @Override public IQuestion<org.overture.typechecker.utilities.pattern.PatternResolver.NewQuestion> getPatternResolver() { return new PatternResolver(this); } @Override public IQuestionAnswer<org.overture.typechecker.utilities.pattern.AllDefinitionLocator.NewQuestion, List<PDefinition>> getAllDefinitionLocator() { return new AllDefinitionLocator(this); } @Override public IAnswer<PType> getPossibleBindTypeFinder() { return new PossibleBindTypeFinder(this); } @Override public IAnswer<List<PMultipleBind>> getMultipleBindLister() { return new MultipleBindLister(this); } @Override public IAnswer<ILexNameToken> getPreNameFinder() { return new PreNameFinder(this); } @Override public IQuestionAnswer<LinkedList<PDefinition>, Collection<? extends PDefinition>> getExportDefinitionFinder() { return new ExportDefinitionFinder(this); } @Override public IAnswer<Collection<? extends PDefinition>> getExportDefinitionListFinder() { return new ExportDefinitionListFinder(this); } @Override public IQuestionAnswer<AModuleModules, List<PDefinition>> getImportDefinitionFinder() { return new ImportDefinitionFinder(this); } @Override public IAnswer<PTypeList> getComposeTypeCollector() { return new ComposeTypeCollector(); } @Override public IQuestionAnswer<TypeCheckInfo, List<QualifiedDefinition>> getQualificationVisitor() { return new QualificationVisitor(); } @Override public TypeComparator getTypeComparator() { if (typeComp == null) { typeComp = new TypeComparator(this); } return typeComp; } @Override public LexNameTokenAssistant getLexNameTokenAssistant() { if (lnt == null) { lnt = new LexNameTokenAssistant(this); } return lnt; } @Override public SFunctionDefinitionAssistantTC createSFunctionDefinitionAssistant() { if (sfd == null) { sfd = new SFunctionDefinitionAssistantTC(this); } return sfd; } @Override public IAnswer<Boolean> getInstanceVariableChecker() { return new InstanceVariableChecker(this); } }