diff --git a/src/main/java/spoon/reflect/factory/Factory.java b/src/main/java/spoon/reflect/factory/Factory.java index 65d5201893b..06305f93ecd 100644 --- a/src/main/java/spoon/reflect/factory/Factory.java +++ b/src/main/java/spoon/reflect/factory/Factory.java @@ -18,6 +18,95 @@ 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.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 java.lang.annotation.Annotation; +import java.util.List; /** * Provides the sub-factories required by Spoon. @@ -60,4 +149,617 @@ public interface Factory { EvalFactory Eval(); // used 4 times ConstructorFactory Constructor(); // used 3 times + + /** + * @see CodeFactory#createAnnotation(CtTypeReference) + */ + CtAnnotation createAnnotation(CtTypeReference annotationType); + + /** + * @see CodeFactory#createVariableAssignment(CtVariableReference,boolean, CtExpression) + */ + CtAssignment createVariableAssignment(CtVariableReference variable, boolean isStatic, CtExpression expression); + + /** + * @see CodeFactory#createStatementList(CtBlock) + */ + CtStatementList createStatementList(CtBlock block); + + /** + * @see CodeFactory#createCtBlock(T) + */ + CtBlock createCtBlock(T element); + + /** + * @see CodeFactory#createBinaryOperator(CtExpression,CtExpression, BinaryOperatorKind) + */ + CtBinaryOperator createBinaryOperator(CtExpression left, CtExpression right, BinaryOperatorKind kind); + + /** + * @see CodeFactory#createCatchVariable(CtTypeReference,String, ModifierKind[]) + */ + CtCatchVariable createCatchVariable(CtTypeReference type, String name, ModifierKind... modifierKinds); + + /** + * @see CodeFactory#createCodeSnippetExpression(String) + */ + CtCodeSnippetExpression createCodeSnippetExpression(String expression); + + /** + * @see CodeFactory#createConstructorCall(CtTypeReference,CtExpression[]) + */ + CtConstructorCall createConstructorCall(CtTypeReference type, CtExpression... parameters); + + /** + * @see CodeFactory#createClassAccess(CtTypeReference) + */ + CtFieldAccess> createClassAccess(CtTypeReference type); + + /** + * @see CodeFactory#createInvocation(CtExpression, CtExecutableReference, List) + */ + CtInvocation createInvocation(CtExpression target, CtExecutableReference executable, List> arguments); + + /** + * @see CodeFactory#createInvocation(CtExpression,CtExecutableReference,CtExpression[]) + */ + CtInvocation createInvocation(CtExpression target, CtExecutableReference executable, CtExpression... arguments); + + /** + * @see CodeFactory#createLiteral(T) + */ + CtLiteral createLiteral(T value); + + /** + * @see CodeFactory#createLocalVariable(CtTypeReference,String,CtExpression) + */ + CtLocalVariable createLocalVariable(CtTypeReference type, String name, CtExpression defaultExpression); + + /** + * @see CodeFactory#createLiteralArray(T[]) + */ + @SuppressWarnings(value = "unchecked") + CtNewArray createLiteralArray(T[] value); + + /** + * @see CodeFactory#createNewClass(CtTypeReference, CtClass,CtExpression[]) + */ + CtNewClass createNewClass(CtTypeReference type, CtClass anonymousClass, CtExpression... parameters); + + /** + * @see CodeFactory#createVariableAssignments(List,List) + */ + CtStatementList createVariableAssignments(List> variables, List> expressions); + + /** + * @see CodeFactory#createThisAccess(CtTypeReference) + */ + CtThisAccess createThisAccess(CtTypeReference type); + + /** + * @see CodeFactory#createThisAccess(CtTypeReference,boolean) + */ + CtThisAccess createThisAccess(CtTypeReference type, boolean isImplicit); + + /** + * @see CodeFactory#createTypeAccess(CtTypeReference) + */ + CtTypeAccess createTypeAccess(CtTypeReference accessedType); + + /** + * @see CodeFactory#createTypeAccess(CtTypeReference,boolean) + */ + CtTypeAccess createTypeAccess(CtTypeReference accessedType, boolean isImplicit); + + /** + * @see CodeFactory#createTypeAccessWithoutCloningReference(CtTypeReference) + */ + CtTypeAccess createTypeAccessWithoutCloningReference(CtTypeReference accessedType); + + /** + * @see CodeFactory#createVariableRead(CtVariableReference,boolean) + */ + CtVariableAccess createVariableRead(CtVariableReference variable, boolean isStatic); + + /** + * @see CodeFactory#createCtField(String,CtTypeReference,String,ModifierKind[]) + */ + CtField createCtField(String name, CtTypeReference type, String exp, ModifierKind... visibilities); + + /** + * @see CodeFactory#createCatchVariableReference(CtCatchVariable) + */ + CtCatchVariableReference createCatchVariableReference(CtCatchVariable catchVariable); + + /** + * @see CodeFactory#createLocalVariableReference(CtLocalVariable) + */ + CtLocalVariableReference createLocalVariableReference(CtLocalVariable localVariable); + + /** + * @see CodeFactory#createLocalVariableReference(CtTypeReference,String) + */ + CtLocalVariableReference createLocalVariableReference(CtTypeReference type, String name); + + /** + * @see CodeFactory#createCtTypeReference(Class) + */ + CtTypeReference createCtTypeReference(Class originalClass); + + /** + * @see CodeFactory#createVariableReads(List) + */ + List> createVariableReads(List> variables); + + /** + * @see CodeFactory#createCtCatch(String,Class,CtBlock) + */ + CtCatch createCtCatch(String nameCatch, Class 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) + */ + CtConstructor createDefault(CtClass target); + + /** + * @see CoreFactory#createAnnotation() + */ + CtAnnotation createAnnotation(); + + /** + * @see CoreFactory#createBlock() + */ + CtBlock createBlock(); + + /** + * @see CoreFactory#createReturn() + */ + CtReturn createReturn(); + + /** + * @see CoreFactory#createStatementList() + */ + CtStatementList createStatementList(); + + /** + * @see CoreFactory#createCase() + */ + CtCase createCase(); + + /** + * @see CoreFactory#createSwitch() + */ + CtSwitch createSwitch(); + + /** + * @see CoreFactory#createEnum() + */ + > CtEnum createEnum(); + + /** + * @see CoreFactory#createAnnotationType() + */ + CtAnnotationType createAnnotationType(); + + /** + * @see CoreFactory#createAssignment() + */ + CtAssignment createAssignment(); + + /** + * @see CoreFactory#createOperatorAssignment() + */ + CtOperatorAssignment createOperatorAssignment(); + + /** + * @see CoreFactory#createExecutableReferenceExpression() + */ + > CtExecutableReferenceExpression createExecutableReferenceExpression(); + + /** + * @see CoreFactory#createAnnotationFieldAccess() + */ + CtAnnotationFieldAccess createAnnotationFieldAccess(); + + /** + * @see CoreFactory#createArrayRead() + */ + CtArrayRead createArrayRead(); + + /** + * @see CoreFactory#createArrayWrite() + */ + CtArrayWrite createArrayWrite(); + + /** + * @see CoreFactory#createAssert() + */ + CtAssert createAssert(); + + /** + * @see CoreFactory#createBinaryOperator() + */ + CtBinaryOperator createBinaryOperator(); + + /** + * @see CoreFactory#createCatchVariable() + */ + CtCatchVariable createCatchVariable(); + + /** + * @see CoreFactory#createCodeSnippetExpression() + */ + CtCodeSnippetExpression createCodeSnippetExpression(); + + /** + * @see CoreFactory#createConditional() + */ + CtConditional createConditional(); + + /** + * @see CoreFactory#createConstructorCall() + */ + CtConstructorCall createConstructorCall(); + + /** + * @see CoreFactory#createFieldRead() + */ + CtFieldRead createFieldRead(); + + /** + * @see CoreFactory#createFieldWrite() + */ + CtFieldWrite createFieldWrite(); + + /** + * @see CoreFactory#createInvocation() + */ + CtInvocation createInvocation(); + + /** + * @see CoreFactory#createLambda() + */ + CtLambda createLambda(); + + /** + * @see CoreFactory#createLiteral() + */ + CtLiteral createLiteral(); + + /** + * @see CoreFactory#createLocalVariable() + */ + CtLocalVariable createLocalVariable(); + + /** + * @see CoreFactory#createNewArray() + */ + CtNewArray createNewArray(); + + /** + * @see CoreFactory#createNewClass() + */ + CtNewClass createNewClass(); + + /** + * @see CoreFactory#createSuperAccess() + */ + CtSuperAccess createSuperAccess(); + + /** + * @see CoreFactory#createThisAccess() + */ + CtThisAccess createThisAccess(); + + /** + * @see CoreFactory#createTypeAccess() + */ + CtTypeAccess createTypeAccess(); + + /** + * @see CoreFactory#createUnaryOperator() + */ + CtUnaryOperator createUnaryOperator(); + + /** + * @see CoreFactory#createVariableRead() + */ + CtVariableRead createVariableRead(); + + /** + * @see CoreFactory#createVariableWrite() + */ + CtVariableWrite createVariableWrite(); + + /** + * @see CoreFactory#createAnnotationMethod() + */ + CtAnnotationMethod createAnnotationMethod(); + + /** + * @see CoreFactory#createClass() + */ + CtClass createClass(); + + /** + * @see CoreFactory#createConstructor() + */ + CtConstructor createConstructor(); + + /** + * @see CoreFactory#createEnumValue() + */ + CtEnumValue createEnumValue(); + + /** + * @see CoreFactory#createField() + */ + CtField createField(); + + /** + * @see CoreFactory#createInterface() + */ + CtInterface createInterface(); + + /** + * @see CoreFactory#createMethod() + */ + CtMethod createMethod(); + + /** + * @see CoreFactory#createParameter() + */ + CtParameter createParameter(); + + /** + * @see CoreFactory#createArrayTypeReference() + */ + CtArrayTypeReference createArrayTypeReference(); + + /** + * @see CoreFactory#createCatchVariableReference() + */ + CtCatchVariableReference createCatchVariableReference(); + + /** + * @see CoreFactory#createExecutableReference() + */ + CtExecutableReference createExecutableReference(); + + /** + * @see CoreFactory#createFieldReference() + */ + CtFieldReference createFieldReference(); + + /** + * @see CoreFactory#createIntersectionTypeReference() + */ + CtIntersectionTypeReference createIntersectionTypeReference(); + + /** + * @see CoreFactory#createLocalVariableReference() + */ + CtLocalVariableReference createLocalVariableReference(); + + /** + * @see CoreFactory#createParameterReference() + */ + CtParameterReference createParameterReference(); + + /** + * @see CoreFactory#createTypeReference() + */ + CtTypeReference createTypeReference(); + + /** + * @see CoreFactory#createUnboundVariableReference() + */ + CtUnboundVariableReference 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,int[]) + */ + @Deprecated + SourcePosition createSourcePosition(CompilationUnit compilationUnit, int startDeclaration, int startSource, int end, int[] lineSeparatorPositions); + + /** + * @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) + */ + CtParameter createParameter(CtExecutable parent, CtTypeReference type, String name); + + /** + * @see ExecutableFactory#createParameterReference(CtParameter) + */ + CtParameterReference createParameterReference(CtParameter parameter); + + /** + * @see ExecutableFactory#createAnonymous(CtClass,CtBlock) + */ + CtAnonymousExecutable createAnonymous(CtClass target, CtBlock body); + + /** + * @see TypeFactory#createArrayReference(String) + */ + CtArrayTypeReference createArrayReference(String qualifiedName); + + /** + * @see TypeFactory#createArrayReference(CtType) + */ + CtArrayTypeReference createArrayReference(CtType type); + + /** + * @see TypeFactory#createArrayReference(CtTypeReference) + */ + CtArrayTypeReference createArrayReference(CtTypeReference reference); + + /** + * @see TypeFactory#createIntersectionTypeReferenceWithBounds(List) + */ + CtIntersectionTypeReference createIntersectionTypeReferenceWithBounds(List> bounds); + + /** + * @see TypeFactory#createReferences(List) + */ + List> createReferences(List> classes); + + /** + * @see TypeFactory#createArrayReference(CtTypeReference,int) + */ + CtArrayTypeReference createArrayReference(CtTypeReference reference, int n); + + /** + * @see TypeFactory#createTypeParameterReference(String) + */ + CtTypeParameterReference createTypeParameterReference(String name); + } diff --git a/src/main/java/spoon/reflect/factory/FactoryImpl.java b/src/main/java/spoon/reflect/factory/FactoryImpl.java index bf24af4e0a4..6952ef4f7ab 100644 --- a/src/main/java/spoon/reflect/factory/FactoryImpl.java +++ b/src/main/java/spoon/reflect/factory/FactoryImpl.java @@ -19,23 +19,100 @@ import spoon.compiler.Environment; import spoon.reflect.CtModel; import spoon.reflect.CtModelImpl; +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.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.support.DefaultCoreFactory; import spoon.support.StandardEnvironment; import java.io.IOException; import java.io.Serializable; +import java.lang.annotation.Annotation; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; @@ -334,4 +411,617 @@ protected Dedup initialValue() { public CtModel getModel() { return model; } + + @Override + public CtAnnotation createAnnotation(CtTypeReference annotationType) { + return Code().createAnnotation(annotationType); + } + + @Override + public CtAssignment createVariableAssignment(CtVariableReference variable, boolean isStatic, CtExpression expression) { + return Code().createVariableAssignment(variable, isStatic, expression); + } + + @Override + public CtStatementList createStatementList(CtBlock block) { + return Code().createStatementList(block); + } + + @Override + public CtBlock createCtBlock(T element) { + return Code().createCtBlock(element); + } + + @Override + public CtBinaryOperator createBinaryOperator(CtExpression left, CtExpression right, BinaryOperatorKind kind) { + return Code().createBinaryOperator(left, right, kind); + } + + @Override + public CtCatchVariable createCatchVariable(CtTypeReference type, String name, ModifierKind... modifierKinds) { + return Code().createCatchVariable(type, name, modifierKinds); + } + + @Override + public CtCodeSnippetExpression createCodeSnippetExpression(String expression) { + return Code().createCodeSnippetExpression(expression); + } + + @Override + public CtConstructorCall createConstructorCall(CtTypeReference type, CtExpression... parameters) { + return Code().createConstructorCall(type, parameters); + } + + @Override + public CtFieldAccess> createClassAccess(CtTypeReference type) { + return Code().createClassAccess(type); + } + + @Override + public CtInvocation createInvocation(CtExpression target, CtExecutableReference executable, List> arguments) { + return Code().createInvocation(target, executable, arguments); + } + + @Override + public CtInvocation createInvocation(CtExpression target, CtExecutableReference executable, CtExpression... arguments) { + return Code().createInvocation(target, executable, arguments); + } + + @Override + public CtLiteral createLiteral(T value) { + return Code().createLiteral(value); + } + + @Override + public CtLocalVariable createLocalVariable(CtTypeReference type, String name, CtExpression defaultExpression) { + return Code().createLocalVariable(type, name, defaultExpression); + } + + @SuppressWarnings(value = "unchecked") + @Override + public CtNewArray createLiteralArray(T[] value) { + return Code().createLiteralArray(value); + } + + @Override + public CtNewClass createNewClass(CtTypeReference type, CtClass anonymousClass, CtExpression... parameters) { + return Code().createNewClass(type, anonymousClass, parameters); + } + + @Override + public CtStatementList createVariableAssignments(List> variables, List> expressions) { + return Code().createVariableAssignments(variables, expressions); + } + + @Override + public CtThisAccess createThisAccess(CtTypeReference type) { + return Code().createThisAccess(type); + } + + @Override + public CtThisAccess createThisAccess(CtTypeReference type, boolean isImplicit) { + return Code().createThisAccess(type, isImplicit); + } + + @Override + public CtTypeAccess createTypeAccess(CtTypeReference accessedType) { + return Code().createTypeAccess(accessedType); + } + + @Override + public CtTypeAccess createTypeAccess(CtTypeReference accessedType, boolean isImplicit) { + return Code().createTypeAccess(accessedType, isImplicit); + } + + @Override + public CtTypeAccess createTypeAccessWithoutCloningReference(CtTypeReference accessedType) { + return Code().createTypeAccessWithoutCloningReference(accessedType); + } + + @Override + public CtVariableAccess createVariableRead(CtVariableReference variable, boolean isStatic) { + return Code().createVariableRead(variable, isStatic); + } + + @Override + public CtField createCtField(String name, CtTypeReference type, String exp, ModifierKind... visibilities) { + return Code().createCtField(name, type, exp, visibilities); + } + + @Override + public CtCatchVariableReference createCatchVariableReference(CtCatchVariable catchVariable) { + return Code().createCatchVariableReference(catchVariable); + } + + @Override + public CtLocalVariableReference createLocalVariableReference(CtLocalVariable localVariable) { + return Code().createLocalVariableReference(localVariable); + } + + @Override + public CtLocalVariableReference createLocalVariableReference(CtTypeReference type, String name) { + return Code().createLocalVariableReference(type, name); + } + + @Override + public CtTypeReference createCtTypeReference(Class originalClass) { + return Code().createCtTypeReference(originalClass); + } + + @Override + public List> createVariableReads(List> variables) { + return Code().createVariableReads(variables); + } + + @Override + public CtCatch createCtCatch(String nameCatch, Class exception, CtBlock ctBlock) { + return Code().createCtCatch(nameCatch, exception, ctBlock); + } + + @Override + public CtCodeSnippetStatement createCodeSnippetStatement(String statement) { + return Code().createCodeSnippetStatement(statement); + } + + @Override + public CtComment createComment(String content, CtComment.CommentType type) { + return Code().createComment(content, type); + } + + @Override + public CtComment createInlineComment(String content) { + return Code().createInlineComment(content); + } + + @Override + public CtThrow createCtThrow(String thrownExp) { + return Code().createCtThrow(thrownExp); + } + + @Override + public CtPackageReference createCtPackageReference(Package originalPackage) { + return Code().createCtPackageReference(originalPackage); + } + + @Override + public CtConstructor createDefault(CtClass target) { + return Constructor().createDefault(target); + } + + @Override + public CtAnnotation createAnnotation() { + return Core().createAnnotation(); + } + + @Override + public CtBlock createBlock() { + return Core().createBlock(); + } + + @Override + public CtReturn createReturn() { + return Core().createReturn(); + } + + @Override + public CtStatementList createStatementList() { + return Core().createStatementList(); + } + + @Override + public CtCase createCase() { + return Core().createCase(); + } + + @Override + public CtSwitch createSwitch() { + return Core().createSwitch(); + } + + @Override + public > CtEnum createEnum() { + return Core().createEnum(); + } + + @Override + public CtAnnotationType createAnnotationType() { + return Core().createAnnotationType(); + } + + @Override + public CtAssignment createAssignment() { + return Core().createAssignment(); + } + + @Override + public CtOperatorAssignment createOperatorAssignment() { + return Core().createOperatorAssignment(); + } + + @Override + public > CtExecutableReferenceExpression createExecutableReferenceExpression() { + return Core().createExecutableReferenceExpression(); + } + + @Override + public CtAnnotationFieldAccess createAnnotationFieldAccess() { + return Core().createAnnotationFieldAccess(); + } + + @Override + public CtArrayRead createArrayRead() { + return Core().createArrayRead(); + } + + @Override + public CtArrayWrite createArrayWrite() { + return Core().createArrayWrite(); + } + + @Override + public CtAssert createAssert() { + return Core().createAssert(); + } + + @Override + public CtBinaryOperator createBinaryOperator() { + return Core().createBinaryOperator(); + } + + @Override + public CtCatchVariable createCatchVariable() { + return Core().createCatchVariable(); + } + + @Override + public CtCodeSnippetExpression createCodeSnippetExpression() { + return Core().createCodeSnippetExpression(); + } + + @Override + public CtConditional createConditional() { + return Core().createConditional(); + } + + @Override + public CtConstructorCall createConstructorCall() { + return Core().createConstructorCall(); + } + + @Override + public CtFieldRead createFieldRead() { + return Core().createFieldRead(); + } + + @Override + public CtFieldWrite createFieldWrite() { + return Core().createFieldWrite(); + } + + @Override + public CtInvocation createInvocation() { + return Core().createInvocation(); + } + + @Override + public CtLambda createLambda() { + return Core().createLambda(); + } + + @Override + public CtLiteral createLiteral() { + return Core().createLiteral(); + } + + @Override + public CtLocalVariable createLocalVariable() { + return Core().createLocalVariable(); + } + + @Override + public CtNewArray createNewArray() { + return Core().createNewArray(); + } + + @Override + public CtNewClass createNewClass() { + return Core().createNewClass(); + } + + @Override + public CtSuperAccess createSuperAccess() { + return Core().createSuperAccess(); + } + + @Override + public CtThisAccess createThisAccess() { + return Core().createThisAccess(); + } + + @Override + public CtTypeAccess createTypeAccess() { + return Core().createTypeAccess(); + } + + @Override + public CtUnaryOperator createUnaryOperator() { + return Core().createUnaryOperator(); + } + + @Override + public CtVariableRead createVariableRead() { + return Core().createVariableRead(); + } + + @Override + public CtVariableWrite createVariableWrite() { + return Core().createVariableWrite(); + } + + @Override + public CtAnnotationMethod createAnnotationMethod() { + return Core().createAnnotationMethod(); + } + + @Override + public CtClass createClass() { + return Core().createClass(); + } + + @Override + public CtConstructor createConstructor() { + return Core().createConstructor(); + } + + @Override + public CtEnumValue createEnumValue() { + return Core().createEnumValue(); + } + + @Override + public CtField createField() { + return Core().createField(); + } + + @Override + public CtInterface createInterface() { + return Core().createInterface(); + } + + @Override + public CtMethod createMethod() { + return Core().createMethod(); + } + + @Override + public CtParameter createParameter() { + return Core().createParameter(); + } + + @Override + public CtArrayTypeReference createArrayTypeReference() { + return Core().createArrayTypeReference(); + } + + @Override + public CtCatchVariableReference createCatchVariableReference() { + return Core().createCatchVariableReference(); + } + + @Override + public CtExecutableReference createExecutableReference() { + return Core().createExecutableReference(); + } + + @Override + public CtFieldReference createFieldReference() { + return Core().createFieldReference(); + } + + @Override + public CtIntersectionTypeReference createIntersectionTypeReference() { + return Core().createIntersectionTypeReference(); + } + + @Override + public CtLocalVariableReference createLocalVariableReference() { + return Core().createLocalVariableReference(); + } + + @Override + public CtParameterReference createParameterReference() { + return Core().createParameterReference(); + } + + @Override + public CtTypeReference createTypeReference() { + return Core().createTypeReference(); + } + + @Override + public CtUnboundVariableReference createUnboundVariableReference() { + return Core().createUnboundVariableReference(); + } + + @Override + public CtBreak createBreak() { + return Core().createBreak(); + } + + @Override + public CtCatch createCatch() { + return Core().createCatch(); + } + + @Override + public CtCodeSnippetStatement createCodeSnippetStatement() { + return Core().createCodeSnippetStatement(); + } + + @Override + public CtComment createComment() { + return Core().createComment(); + } + + @Override + public CtContinue createContinue() { + return Core().createContinue(); + } + + @Override + public CtDo createDo() { + return Core().createDo(); + } + + @Override + public CtFor createFor() { + return Core().createFor(); + } + + @Override + public CtForEach createForEach() { + return Core().createForEach(); + } + + @Override + public CtIf createIf() { + return Core().createIf(); + } + + @Override + public CtSynchronized createSynchronized() { + return Core().createSynchronized(); + } + + @Override + public CtThrow createThrow() { + return Core().createThrow(); + } + + @Override + public CtTry createTry() { + return Core().createTry(); + } + + @Override + public CtTryWithResource createTryWithResource() { + return Core().createTryWithResource(); + } + + @Override + public CtWhile createWhile() { + return Core().createWhile(); + } + + @Override + public CompilationUnit createCompilationUnit() { + return Core().createCompilationUnit(); + } + + @Deprecated + @Override + public SourcePosition createSourcePosition(CompilationUnit compilationUnit, int startDeclaration, int startSource, int end, int[] lineSeparatorPositions) { + return Core().createSourcePosition(compilationUnit, startDeclaration, startSource, end, lineSeparatorPositions); + } + + @Override + public SourcePosition createSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int[] lineSeparatorPositions) { + return Core().createSourcePosition(compilationUnit, startSource, end, lineSeparatorPositions); + } + + @Override + public BodyHolderSourcePosition createBodyHolderSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int modifierStart, int modifierEnd, int declarationStart, int declarationEnd, int bodyStart, int bodyEnd, int[] lineSeparatorPositions) { + return Core().createBodyHolderSourcePosition(compilationUnit, startSource, end, modifierStart, modifierEnd, declarationStart, declarationEnd, bodyStart, bodyEnd, lineSeparatorPositions); + } + + @Override + public DeclarationSourcePosition createDeclarationSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int modifierStart, int modifierEnd, int declarationStart, int declarationEnd, int[] lineSeparatorPositions) { + return Core().createDeclarationSourcePosition(compilationUnit, startSource, end, modifierStart, modifierEnd, declarationStart, declarationEnd, lineSeparatorPositions); + } + + @Override + public CtAnonymousExecutable createAnonymousExecutable() { + return Core().createAnonymousExecutable(); + } + + @Override + public CtPackage createPackage() { + return Core().createPackage(); + } + + @Override + public CtTypeParameter createTypeParameter() { + return Core().createTypeParameter(); + } + + @Override + public CtPackageReference createPackageReference() { + return Core().createPackageReference(); + } + + @Override + public CtTypeParameterReference createTypeParameterReference() { + return Core().createTypeParameterReference(); + } + + @Override + public CtWildcardReference createWildcardReference() { + return Core().createWildcardReference(); + } + + @Override + public PartialEvaluator createPartialEvaluator() { + return Eval().createPartialEvaluator(); + } + + @Override + public CtParameter createParameter(CtExecutable parent, CtTypeReference type, String name) { + return Executable().createParameter(parent, type, name); + } + + @Override + public CtParameterReference createParameterReference(CtParameter parameter) { + return Executable().createParameterReference(parameter); + } + + @Override + public CtAnonymousExecutable createAnonymous(CtClass target, CtBlock body) { + return Executable().createAnonymous(target, body); + } + + @Override + public CtArrayTypeReference createArrayReference(String qualifiedName) { + return Type().createArrayReference(qualifiedName); + } + + @Override + public CtArrayTypeReference createArrayReference(CtType type) { + return Type().createArrayReference(type); + } + + @Override + public CtArrayTypeReference createArrayReference(CtTypeReference reference) { + return Type().createArrayReference(reference); + } + + @Override + public CtIntersectionTypeReference createIntersectionTypeReferenceWithBounds(List> bounds) { + return Type().createIntersectionTypeReferenceWithBounds(bounds); + } + + @Override + public List> createReferences(List> classes) { + return Type().createReferences(classes); + } + + @Override + public CtArrayTypeReference createArrayReference(CtTypeReference reference, int n) { + return Type().createArrayReference(reference, n); + } + + @Override + public CtTypeParameterReference createTypeParameterReference(String name) { + return Type().createTypeParameterReference(name); + } + } diff --git a/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java b/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java index 2ab43a2658f..991ca52e324 100644 --- a/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java +++ b/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java @@ -3,13 +3,18 @@ import org.junit.Test; import spoon.Launcher; import spoon.SpoonAPI; +import spoon.processing.AbstractManualProcessor; import spoon.reflect.code.CtConstructorCall; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtField; +import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.factory.Factory; +import spoon.reflect.factory.FactoryImpl; import spoon.reflect.visitor.filter.AbstractFilter; import spoon.reflect.visitor.filter.TypeFilter; @@ -47,6 +52,48 @@ public boolean matches(CtType element) { } + @Test + public void testFactorySubFactory() throws Exception { + // contract:: all subfactory methods must also be in the main factory + // this is very important for usability and discoverability + final Launcher launcher = new Launcher(); + launcher.addInputResource("./src/main/java/spoon/reflect/factory"); + class SanityCheck { int val = 0; }; + SanityCheck sanityCheck = new SanityCheck(); + launcher.addProcessor(new AbstractManualProcessor() { + @Override + public void process() { + CtType factoryImpl = getFactory().Interface().get(Factory.class); + CtPackage factoryPackage = getFactory().Package().getOrCreate("spoon.reflect.factory"); + CtInterface itf = getFactory().Interface().create("MegaFactoryItf"); + CtClass impl = getFactory().Class().create("MegaFactory"); + for (CtType t : factoryPackage.getTypes()) { + if (t.getSimpleName().startsWith("Mega")) continue; // + for (CtMethod m : t.getMethods()) { + // we only consider factory methods + if (!m.getSimpleName().startsWith("create")) continue; + + // too generic, what should we create?? + if (m.getSimpleName().equals("create")) continue; + + // too generic, is it a fieldref? an execref? etc + if (m.getSimpleName().equals("createReference")) + continue; + + if (m.getModifiers().contains(ModifierKind.ABSTRACT)) continue; + + sanityCheck.val++; + + // the core assertion + assertTrue(factoryImpl.hasMethod(m)); + } + } + } + }); + launcher.run(); + assertTrue(sanityCheck.val > 100); + } + @Test public void noTreeSetInSpoon() throws Exception { // we don't use TreeSet, because they implicitly depend on Comparable (no static check, only dynamic checks)