/** * Copyright (C) 2006-2017 INRIA and contributors * Spoon - http://spoon.gforge.inria.fr/ * * This software is governed by the CeCILL-C License under French law and * abiding by the rules of distribution of free software. You can use, modify * and/or redistribute the software under the terms of the CeCILL-C license as * circulated by CEA, CNRS and INRIA at http://www.cecill.info. * * 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 CeCILL-C License for more details. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL-C license and that you accept its terms. */ package spoon.reflect.factory; import spoon.compiler.Environment; import spoon.reflect.CtModel; import spoon.reflect.code.BinaryOperatorKind; import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtArrayRead; import spoon.reflect.code.CtArrayWrite; import spoon.reflect.code.CtAssert; import spoon.reflect.code.CtAssignment; import spoon.reflect.code.CtBinaryOperator; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtBreak; import spoon.reflect.code.CtCase; import spoon.reflect.code.CtCatch; import spoon.reflect.code.CtCatchVariable; import spoon.reflect.code.CtCodeSnippetExpression; import spoon.reflect.code.CtCodeSnippetStatement; import spoon.reflect.code.CtComment; import spoon.reflect.code.CtConditional; import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtContinue; import spoon.reflect.code.CtDo; import spoon.reflect.code.CtExecutableReferenceExpression; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtFieldAccess; import spoon.reflect.code.CtFieldRead; import spoon.reflect.code.CtFieldWrite; import spoon.reflect.code.CtFor; import spoon.reflect.code.CtForEach; import spoon.reflect.code.CtIf; import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtLambda; import spoon.reflect.code.CtLiteral; import spoon.reflect.code.CtLocalVariable; import spoon.reflect.code.CtNewArray; import spoon.reflect.code.CtNewClass; import spoon.reflect.code.CtOperatorAssignment; import spoon.reflect.code.CtReturn; import spoon.reflect.code.CtStatement; import spoon.reflect.code.CtStatementList; import spoon.reflect.code.CtSuperAccess; import spoon.reflect.code.CtSwitch; import spoon.reflect.code.CtSynchronized; import spoon.reflect.code.CtThisAccess; import spoon.reflect.code.CtThrow; import spoon.reflect.code.CtTry; import spoon.reflect.code.CtTryWithResource; import spoon.reflect.code.CtTypeAccess; import spoon.reflect.code.CtUnaryOperator; import spoon.reflect.code.CtVariableAccess; import spoon.reflect.code.CtVariableRead; import spoon.reflect.code.CtVariableWrite; import spoon.reflect.code.CtWhile; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; import spoon.reflect.cu.position.BodyHolderSourcePosition; import spoon.reflect.cu.position.DeclarationSourcePosition; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtAnnotationMethod; import spoon.reflect.declaration.CtAnnotationType; import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtEnum; import spoon.reflect.declaration.CtEnumValue; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtFormalTypeDeclarer; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtParameter; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.CtTypeParameter; import spoon.reflect.declaration.CtVariable; import spoon.reflect.declaration.ModifierKind; import spoon.reflect.eval.PartialEvaluator; import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtCatchVariableReference; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtIntersectionTypeReference; import spoon.reflect.reference.CtLocalVariableReference; import spoon.reflect.reference.CtPackageReference; import spoon.reflect.reference.CtParameterReference; import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtUnboundVariableReference; import spoon.reflect.reference.CtVariableReference; import spoon.reflect.reference.CtWildcardReference; import spoon.reflect.visitor.chain.CtQuery; import spoon.support.visitor.GenericTypeAdapter; import java.lang.annotation.Annotation; import java.util.List; /** * Provides the sub-factories required by Spoon. * * Most classes provides a method getFactory() that returns the current factory. * * Otherwise FactoryImpl is a default implementation. */ public interface Factory { /** returns the Spoon model that has been built with this factory or one of its subfactories */ CtModel getModel(); CoreFactory Core(); // used 238 times TypeFactory Type(); // used 107 times EnumFactory Enum(); Environment getEnvironment(); // used 71 times PackageFactory Package(); // used 30 times CodeFactory Code(); // used 28 times ClassFactory Class(); // used 27 times FieldFactory Field(); // used 9 times ExecutableFactory Executable(); // used 8 times CompilationUnitFactory CompilationUnit(); // used 7 times InterfaceFactory Interface(); MethodFactory Method(); // used 5 times AnnotationFactory Annotation(); // used 4 times EvalFactory Eval(); // used 4 times ConstructorFactory Constructor(); // used 3 times QueryFactory Query(); /** * @see CodeFactory#createAnnotation(CtTypeReference) */ <A extends Annotation> CtAnnotation<A> createAnnotation(CtTypeReference<A> annotationType); /** * @see CodeFactory#createVariableAssignment(CtVariableReference,boolean, CtExpression) */ <A, T extends A> CtAssignment<A, T> createVariableAssignment(CtVariableReference<A> variable, boolean isStatic, CtExpression<T> expression); /** * @see CodeFactory#createStatementList(CtBlock) */ <R> CtStatementList createStatementList(CtBlock<R> block); /** * @see CodeFactory#createCtBlock(CtStatement) */ <T extends CtStatement> CtBlock<?> createCtBlock(T element); /** * @see CodeFactory#createBinaryOperator(CtExpression,CtExpression, BinaryOperatorKind) */ <T> CtBinaryOperator<T> createBinaryOperator(CtExpression<?> left, CtExpression<?> right, BinaryOperatorKind kind); /** * @see CodeFactory#createCatchVariable(CtTypeReference,String, ModifierKind[]) */ <T> CtCatchVariable<T> createCatchVariable(CtTypeReference<T> type, String name, ModifierKind... modifierKinds); /** * @see CodeFactory#createCodeSnippetExpression(String) */ <T> CtCodeSnippetExpression<T> createCodeSnippetExpression(String expression); /** * @see CodeFactory#createConstructorCall(CtTypeReference,CtExpression[]) */ <T> CtConstructorCall<T> createConstructorCall(CtTypeReference<T> type, CtExpression<?>... parameters); /** * @see CodeFactory#createClassAccess(CtTypeReference) */ <T> CtFieldAccess<Class<T>> createClassAccess(CtTypeReference<T> type); /** * @see CodeFactory#createInvocation(CtExpression, CtExecutableReference, List) */ <T> CtInvocation<T> createInvocation(CtExpression<?> target, CtExecutableReference<T> executable, List<CtExpression<?>> arguments); /** * @see CodeFactory#createInvocation(CtExpression,CtExecutableReference,CtExpression[]) */ <T> CtInvocation<T> createInvocation(CtExpression<?> target, CtExecutableReference<T> executable, CtExpression<?>... arguments); /** * @see CodeFactory#createLiteral(Object) */ <T> CtLiteral<T> createLiteral(T value); /** * @see CodeFactory#createLocalVariable(CtTypeReference,String,CtExpression) */ <T> CtLocalVariable<T> createLocalVariable(CtTypeReference<T> type, String name, CtExpression<T> defaultExpression); /** * @see CodeFactory#createLiteralArray(Object[]) */ @SuppressWarnings(value = "unchecked") <T> CtNewArray<T[]> createLiteralArray(T[] value); /** * @see CodeFactory#createNewClass(CtTypeReference, CtClass,CtExpression[]) */ <T> CtNewClass<T> createNewClass(CtTypeReference<T> type, CtClass<?> anonymousClass, CtExpression<?>... parameters); /** * @see CodeFactory#createVariableAssignments(List,List) */ <T> CtStatementList createVariableAssignments(List<? extends CtVariable<T>> variables, List<? extends CtExpression<T>> expressions); /** * @see CodeFactory#createThisAccess(CtTypeReference) */ <T> CtThisAccess<T> createThisAccess(CtTypeReference<T> type); /** * @see CodeFactory#createThisAccess(CtTypeReference,boolean) */ <T> CtThisAccess<T> createThisAccess(CtTypeReference<T> type, boolean isImplicit); /** * @see CodeFactory#createTypeAccess(CtTypeReference) */ <T> CtTypeAccess<T> createTypeAccess(CtTypeReference<T> accessedType); /** * @see CodeFactory#createTypeAccess(CtTypeReference,boolean) */ <T> CtTypeAccess<T> createTypeAccess(CtTypeReference<T> accessedType, boolean isImplicit); /** * @see CodeFactory#createTypeAccessWithoutCloningReference(CtTypeReference) */ <T> CtTypeAccess<T> createTypeAccessWithoutCloningReference(CtTypeReference<T> accessedType); /** * @see CodeFactory#createVariableRead(CtVariableReference,boolean) */ <T> CtVariableAccess<T> createVariableRead(CtVariableReference<T> variable, boolean isStatic); /** * @see CodeFactory#createCtField(String,CtTypeReference,String,ModifierKind[]) */ <T> CtField<T> createCtField(String name, CtTypeReference<T> type, String exp, ModifierKind... visibilities); /** * @see CodeFactory#createCatchVariableReference(CtCatchVariable) */ <T> CtCatchVariableReference<T> createCatchVariableReference(CtCatchVariable<T> catchVariable); /** * @see CodeFactory#createLocalVariableReference(CtLocalVariable) */ <T> CtLocalVariableReference<T> createLocalVariableReference(CtLocalVariable<T> localVariable); /** * @see CodeFactory#createLocalVariableReference(CtTypeReference,String) */ <T> CtLocalVariableReference<T> createLocalVariableReference(CtTypeReference<T> type, String name); /** * @see CodeFactory#createCtTypeReference(Class) */ <T> CtTypeReference<T> createCtTypeReference(Class<?> originalClass); /** * @see CodeFactory#createVariableReads(List) */ List<CtExpression<?>> createVariableReads(List<? extends CtVariable<?>> variables); /** * @see CodeFactory#createCtCatch(String,Class,CtBlock) */ CtCatch createCtCatch(String nameCatch, Class<? extends Throwable> exception, CtBlock<?> ctBlock); /** * @see CodeFactory#createCodeSnippetStatement(String) */ CtCodeSnippetStatement createCodeSnippetStatement(String statement); /** * @see CodeFactory#createComment(String,CtComment.CommentType) */ CtComment createComment(String content, CtComment.CommentType type); /** * @see CodeFactory#createInlineComment(String) */ CtComment createInlineComment(String content); /** * @see CodeFactory#createCtThrow(String) */ CtThrow createCtThrow(String thrownExp); /** * @see CodeFactory#createCtPackageReference(Package) */ CtPackageReference createCtPackageReference(Package originalPackage); /** * @see ConstructorFactory#createDefault(CtClass) */ <T> CtConstructor<T> createDefault(CtClass<T> target); /** * @see CoreFactory#createAnnotation() */ <A extends Annotation> CtAnnotation<A> createAnnotation(); /** * @see CoreFactory#createBlock() */ <R> CtBlock<R> createBlock(); /** * @see CoreFactory#createReturn() */ <R> CtReturn<R> createReturn(); /** * @see CoreFactory#createStatementList() */ <R> CtStatementList createStatementList(); /** * @see CoreFactory#createCase() */ <S> CtCase<S> createCase(); /** * @see CoreFactory#createSwitch() */ <S> CtSwitch<S> createSwitch(); /** * @see CoreFactory#createEnum() */ <T extends Enum<?>> CtEnum<T> createEnum(); /** * @see CoreFactory#createAnnotationType() */ <T extends Annotation> CtAnnotationType<T> createAnnotationType(); /** * @see CoreFactory#createAssignment() */ <T, A extends T> CtAssignment<T, A> createAssignment(); /** * @see CoreFactory#createOperatorAssignment() */ <T, A extends T> CtOperatorAssignment<T, A> createOperatorAssignment(); /** * @see CoreFactory#createExecutableReferenceExpression() */ <T, E extends CtExpression<?>> CtExecutableReferenceExpression<T, E> createExecutableReferenceExpression(); /** * @see CoreFactory#createAnnotationFieldAccess() */ <T> CtAnnotationFieldAccess<T> createAnnotationFieldAccess(); /** * @see CoreFactory#createArrayRead() */ <T> CtArrayRead<T> createArrayRead(); /** * @see CoreFactory#createArrayWrite() */ <T> CtArrayWrite<T> createArrayWrite(); /** * @see CoreFactory#createAssert() */ <T> CtAssert<T> createAssert(); /** * @see CoreFactory#createBinaryOperator() */ <T> CtBinaryOperator<T> createBinaryOperator(); /** * @see CoreFactory#createCatchVariable() */ <T> CtCatchVariable<T> createCatchVariable(); /** * @see CoreFactory#createCodeSnippetExpression() */ <T> CtCodeSnippetExpression<T> createCodeSnippetExpression(); /** * @see CoreFactory#createConditional() */ <T> CtConditional<T> createConditional(); /** * @see CoreFactory#createConstructorCall() */ <T> CtConstructorCall<T> createConstructorCall(); /** * @see CoreFactory#createFieldRead() */ <T> CtFieldRead<T> createFieldRead(); /** * @see CoreFactory#createFieldWrite() */ <T> CtFieldWrite<T> createFieldWrite(); /** * @see CoreFactory#createInvocation() */ <T> CtInvocation<T> createInvocation(); /** * @see CoreFactory#createLambda() */ <T> CtLambda<T> createLambda(); /** * @see CoreFactory#createLiteral() */ <T> CtLiteral<T> createLiteral(); /** * @see CoreFactory#createLocalVariable() */ <T> CtLocalVariable<T> createLocalVariable(); /** * @see CoreFactory#createNewArray() */ <T> CtNewArray<T> createNewArray(); /** * @see CoreFactory#createNewClass() */ <T> CtNewClass<T> createNewClass(); /** * @see CoreFactory#createSuperAccess() */ <T> CtSuperAccess<T> createSuperAccess(); /** * @see CoreFactory#createThisAccess() */ <T> CtThisAccess<T> createThisAccess(); /** * @see CoreFactory#createTypeAccess() */ <T> CtTypeAccess<T> createTypeAccess(); /** * @see CoreFactory#createUnaryOperator() */ <T> CtUnaryOperator<T> createUnaryOperator(); /** * @see CoreFactory#createVariableRead() */ <T> CtVariableRead<T> createVariableRead(); /** * @see CoreFactory#createVariableWrite() */ <T> CtVariableWrite<T> createVariableWrite(); /** * @see CoreFactory#createAnnotationMethod() */ <T> CtAnnotationMethod<T> createAnnotationMethod(); /** * @see CoreFactory#createClass() */ <T> CtClass<T> createClass(); /** * @see CoreFactory#createConstructor() */ <T> CtConstructor<T> createConstructor(); /** * @see CoreFactory#createEnumValue() */ <T> CtEnumValue<T> createEnumValue(); /** * @see CoreFactory#createField() */ <T> CtField<T> createField(); /** * @see CoreFactory#createInterface() */ <T> CtInterface<T> createInterface(); /** * @see CoreFactory#createMethod() */ <T> CtMethod<T> createMethod(); /** * @see CoreFactory#createParameter() */ <T> CtParameter<T> createParameter(); /** * @see CoreFactory#createArrayTypeReference() */ <T> CtArrayTypeReference<T> createArrayTypeReference(); /** * @see CoreFactory#createCatchVariableReference() */ <T> CtCatchVariableReference<T> createCatchVariableReference(); /** * @see CoreFactory#createExecutableReference() */ <T> CtExecutableReference<T> createExecutableReference(); /** * @see CoreFactory#createFieldReference() */ <T> CtFieldReference<T> createFieldReference(); /** * @see CoreFactory#createIntersectionTypeReference() */ <T> CtIntersectionTypeReference<T> createIntersectionTypeReference(); /** * @see CoreFactory#createLocalVariableReference() */ <T> CtLocalVariableReference<T> createLocalVariableReference(); /** * @see CoreFactory#createParameterReference() */ <T> CtParameterReference<T> createParameterReference(); /** * @see CoreFactory#createTypeReference() */ <T> CtTypeReference<T> createTypeReference(); /** * @see CoreFactory#createUnboundVariableReference() */ <T> CtUnboundVariableReference<T> createUnboundVariableReference(); /** * @see CoreFactory#createBreak() */ CtBreak createBreak(); /** * @see CoreFactory#createCatch() */ CtCatch createCatch(); /** * @see CoreFactory#createCodeSnippetStatement() */ CtCodeSnippetStatement createCodeSnippetStatement(); /** * @see CoreFactory#createComment() */ CtComment createComment(); /** * @see CoreFactory#createContinue() */ CtContinue createContinue(); /** * @see CoreFactory#createDo() */ CtDo createDo(); /** * @see CoreFactory#createFor() */ CtFor createFor(); /** * @see CoreFactory#createForEach() */ CtForEach createForEach(); /** * @see CoreFactory#createIf() */ CtIf createIf(); /** * @see CoreFactory#createSynchronized() */ CtSynchronized createSynchronized(); /** * @see CoreFactory#createThrow() */ CtThrow createThrow(); /** * @see CoreFactory#createTry() */ CtTry createTry(); /** * @see CoreFactory#createTryWithResource() */ CtTryWithResource createTryWithResource(); /** * @see CoreFactory#createWhile() */ CtWhile createWhile(); /** * @see CoreFactory#createCompilationUnit() */ CompilationUnit createCompilationUnit(); /** * @see CoreFactory#createSourcePosition(CompilationUnit,int,int,int[]) */ SourcePosition createSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int[] lineSeparatorPositions); /** * @see CoreFactory#createBodyHolderSourcePosition(CompilationUnit,int,int,int,int,int,int,int,int,int[]) */ BodyHolderSourcePosition createBodyHolderSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int modifierStart, int modifierEnd, int declarationStart, int declarationEnd, int bodyStart, int bodyEnd, int[] lineSeparatorPositions); /** * @see CoreFactory#createDeclarationSourcePosition(CompilationUnit,int,int,int,int,int,int,int[]) */ DeclarationSourcePosition createDeclarationSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int modifierStart, int modifierEnd, int declarationStart, int declarationEnd, int[] lineSeparatorPositions); /** * @see CoreFactory#createAnonymousExecutable() */ CtAnonymousExecutable createAnonymousExecutable(); /** * @see CoreFactory#createPackage() */ CtPackage createPackage(); /** * @see CoreFactory#createTypeParameter() */ CtTypeParameter createTypeParameter(); /** * @see CoreFactory#createPackageReference() */ CtPackageReference createPackageReference(); /** * @see CoreFactory#createTypeParameterReference() */ CtTypeParameterReference createTypeParameterReference(); /** * @see CoreFactory#createWildcardReference() */ CtWildcardReference createWildcardReference(); /** * @see EvalFactory#createPartialEvaluator() */ PartialEvaluator createPartialEvaluator(); /** * @see ExecutableFactory#createParameter(CtExecutable,CtTypeReference,String) */ <T> CtParameter<T> createParameter(CtExecutable<?> parent, CtTypeReference<T> type, String name); /** * @see ExecutableFactory#createParameterReference(CtParameter) */ <T> CtParameterReference<T> createParameterReference(CtParameter<T> parameter); /** * @see ExecutableFactory#createAnonymous(CtClass,CtBlock) */ CtAnonymousExecutable createAnonymous(CtClass<?> target, CtBlock<Void> body); /** * @see TypeFactory#createArrayReference(String) */ <T> CtArrayTypeReference<T> createArrayReference(String qualifiedName); /** * @see TypeFactory#createArrayReference(CtType) */ <T> CtArrayTypeReference<T[]> createArrayReference(CtType<T> type); /** * @see TypeFactory#createArrayReference(CtTypeReference) */ <T> CtArrayTypeReference<T[]> createArrayReference(CtTypeReference<T> reference); /** * @see TypeFactory#createIntersectionTypeReferenceWithBounds(List) */ <T> CtIntersectionTypeReference<T> createIntersectionTypeReferenceWithBounds(List<CtTypeReference<?>> bounds); /** * @see TypeFactory#createTypeAdapter(CtFormalTypeDeclarer) */ GenericTypeAdapter createTypeAdapter(CtFormalTypeDeclarer formalTypeDeclarer); /** * @see TypeFactory#createReferences(List) */ List<CtTypeReference<?>> createReferences(List<Class<?>> classes); /** * @see TypeFactory#createArrayReference(CtTypeReference,int) */ CtArrayTypeReference<?> createArrayReference(CtTypeReference<?> reference, int n); /** * @see TypeFactory#createTypeParameterReference(String) */ CtTypeParameterReference createTypeParameterReference(String name); /** * @see QueryFactory#createQuery() */ CtQuery createQuery(); /** * @see QueryFactory#createQuery(Object) */ CtQuery createQuery(Object input); }