/** * 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.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.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.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.CtVariableRead; import spoon.reflect.code.CtVariableWrite; import spoon.reflect.code.CtWhile; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.position.DeclarationSourcePosition; import spoon.reflect.cu.position.BodyHolderSourcePosition; import spoon.reflect.cu.SourcePosition; 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.CtElement; import spoon.reflect.declaration.CtEnum; import spoon.reflect.declaration.CtEnumValue; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtParameter; import spoon.reflect.declaration.CtTypeParameter; 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.CtWildcardReference; import java.lang.annotation.Annotation; /** * This interface defines the core creation methods for the meta-model (to be * implemented so that Spoon can manipulate other meta-model implementations). * <p> * <b>Important</b>: a required post-condition for all the created elements is * that the factory (see {@link spoon.processing.FactoryAccessor#getFactory()}) * is correctly initialized with the main factory returned by * {@link #getMainFactory()}, which cannot be null. */ public interface CoreFactory { /** * Recursively clones a given element of the metamodel and all its child * elements. * * @param <T> the element's type * @param element the element * @return a clone of <code>element</code> * @see spoon.reflect.declaration.CtElement#clone() */ <T extends CtElement> T clone(T element); /** * Creates an annotation. */ <A extends Annotation> CtAnnotation<A> createAnnotation(); /** * Creates an annotation type. */ <T extends Annotation> CtAnnotationType<T> createAnnotationType(); /** * Creates an anonymous executable. */ CtAnonymousExecutable createAnonymousExecutable(); /** * Creates an array read access expression. */ <T> CtArrayRead<T> createArrayRead(); /** * Creates an array write access expression. */ <T> CtArrayWrite<T> createArrayWrite(); /** * Creates an array type reference. */ <T> CtArrayTypeReference<T> createArrayTypeReference(); /** * Creates an <code>assert</code> statement. */ <T> CtAssert<T> createAssert(); /** * Creates an assignment expression. */ <T, A extends T> CtAssignment<T, A> createAssignment(); /** * Creates a binary operator. */ <T> CtBinaryOperator<T> createBinaryOperator(); /** * Creates a block. */ <R> CtBlock<R> createBlock(); /** * Creates a <code>break</code> statement. */ CtBreak createBreak(); /** * Creates a <code>case</code> clause. */ <S> CtCase<S> createCase(); /** * Creates a <code>catch</code> clause. */ CtCatch createCatch(); /** * Creates a class. */ <T> CtClass<T> createClass(); /** * Creates a type parameter declaration. */ CtTypeParameter createTypeParameter(); /** * Creates a conditional expression (<code>boolExpr?ifTrue:ifFalse</code>). */ <T> CtConditional<T> createConditional(); /** * Creates a constructor. */ <T> CtConstructor<T> createConstructor(); /** * Creates a <code>continue</code> statement. */ CtContinue createContinue(); /** * Creates a <code>do</code> loop. */ CtDo createDo(); /** * Creates an enum. */ <T extends Enum<?>> CtEnum<T> createEnum(); /** * Creates an executable reference. */ <T> CtExecutableReference<T> createExecutableReference(); /** * Creates a field. */ <T> CtField<T> createField(); /** * Creates an enum value. */ <T> CtEnumValue<T> createEnumValue(); /** * Creates a field read access. */ <T> CtFieldRead<T> createFieldRead(); /** * Creates a field write access. */ <T> CtFieldWrite<T> createFieldWrite(); /** * Creates an access expression to this. */ <T> CtThisAccess<T> createThisAccess(); /** * Creates an access expression to super. */ <T> CtSuperAccess<T> createSuperAccess(); /** * Creates a field reference. */ <T> CtFieldReference<T> createFieldReference(); /** * Creates a <code>for</code> loop. */ CtFor createFor(); /** * Creates a <code>foreach</code> loop. */ CtForEach createForEach(); /** * Creates an <code>if</code> statement. */ CtIf createIf(); /** * Creates an interface. */ <T> CtInterface<T> createInterface(); /** * Creates an invocation expression. */ <T> CtInvocation<T> createInvocation(); /** * Creates a literal expression. */ <T> CtLiteral<T> createLiteral(); /** * Creates a local variable declaration statement. */ <T> CtLocalVariable<T> createLocalVariable(); /** * Creates a local variable reference. */ <T> CtLocalVariableReference<T> createLocalVariableReference(); /** * Creates a catch variable declaration statement. */ <T> CtCatchVariable<T> createCatchVariable(); /** * Creates a catch variable reference. */ <T> CtCatchVariableReference<T> createCatchVariableReference(); /** * Creates a method. */ <T> CtMethod<T> createMethod(); /** * Creates an annotation method. */ <T> CtAnnotationMethod<T> createAnnotationMethod(); /** * Creates a new array expression. */ <T> CtNewArray<T> createNewArray(); /** * Creates a constructor call expression. * * Example to build "new Foo()": * <pre> * CtConstructorCall call = spoon.getFactory().Core().createConstructorCall(); * call.setType(spoon.getFactory().Core().createTypeReference().setSimpleName("Foo")); * </pre> */ <T> CtConstructorCall<T> createConstructorCall(); /** * Creates a new anonymous class expression. */ <T> CtNewClass<T> createNewClass(); /** * Creates a new anonymous method expression. */ <T> CtLambda<T> createLambda(); /** * Creates a new executable reference expression. */ <T, E extends CtExpression<?>> CtExecutableReferenceExpression<T, E> createExecutableReferenceExpression(); /** * Creates a new operator assignment (like +=). */ <T, A extends T> CtOperatorAssignment<T, A> createOperatorAssignment(); /** * Creates a package. */ CtPackage createPackage(); /** * Creates a package reference. */ CtPackageReference createPackageReference(); /** * Creates a parameter. */ <T> CtParameter<T> createParameter(); /** * Creates a parameter reference. */ <T> CtParameterReference<T> createParameterReference(); /** * Creates a <code>return</code> statement. */ <R> CtReturn<R> createReturn(); /** * Creates a source position. */ SourcePosition createSourcePosition( CompilationUnit compilationUnit, int startSource, int end, int[] lineSeparatorPositions); /** * Creates a declaration source position. */ DeclarationSourcePosition createDeclarationSourcePosition( CompilationUnit compilationUnit, int startSource, int end, int modifierStart, int modifierEnd, int declarationStart, int declarationEnd, int[] lineSeparatorPositions); /** * Creates a body holder source position. */ BodyHolderSourcePosition createBodyHolderSourcePosition( CompilationUnit compilationUnit, int startSource, int end, int modifierStart, int modifierEnd, int declarationStart, int declarationEnd, int bodyStart, int bodyEnd, int[] lineSeparatorPositions); /** * Creates a statement list. */ <R> CtStatementList createStatementList(); /** * Creates a <code>switch</code> statement. */ <S> CtSwitch<S> createSwitch(); /** * Creates a <code>synchronized</code> statement. */ CtSynchronized createSynchronized(); /** * Creates a <code>throw</code> statement. */ CtThrow createThrow(); /** * Creates a <code>try</code> block. */ CtTry createTry(); /** * Creates a <code>try</code> with resource block. */ CtTryWithResource createTryWithResource(); /** * Creates a type parameter reference. */ CtTypeParameterReference createTypeParameterReference(); /** * Creates a wildcard reference. */ CtWildcardReference createWildcardReference(); /** * Creates an intersection type reference. */ <T> CtIntersectionTypeReference<T> createIntersectionTypeReference(); /** * Creates a type reference. */ <T> CtTypeReference<T> createTypeReference(); /** * Creates a type access expression. */ <T> CtTypeAccess<T> createTypeAccess(); /** * Creates a unary operator expression. */ <T> CtUnaryOperator<T> createUnaryOperator(); /** * Creates a variable read expression. */ <T> CtVariableRead<T> createVariableRead(); /** * Creates a variable write expression. */ <T> CtVariableWrite<T> createVariableWrite(); /** * Creates a <code>while</code> loop. */ CtWhile createWhile(); /** * Creates a code snippet expression. */ <T> CtCodeSnippetExpression<T> createCodeSnippetExpression(); /** * Creates a code snippet statement. */ CtCodeSnippetStatement createCodeSnippetStatement(); /** * Creates a comment. */ CtComment createComment(); /** * Gets the main factory of that core factory (cannot be <code>null</code>). */ Factory getMainFactory(); /** * Sets the main factory of that core factory. */ void setMainFactory(Factory mainFactory); /** * Creates a compilation unit. */ CompilationUnit createCompilationUnit(); /** * Create an access to annotation value * * @return */ <T> CtAnnotationFieldAccess<T> createAnnotationFieldAccess(); /** * Creates an unbound variable used in noclasspath. */ <T> CtUnboundVariableReference<T> createUnboundVariableReference(); /** * Creates an instance of the concrete metamodel class given as parameter. * * This is in particular useful when one uses reflection. */ CtElement create(Class<? extends CtElement> klass); }