This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 6c9cbbad4cffd4eaa3826f5a0736bc94382913d1 Author: Paul King <[email protected]> AuthorDate: Mon Feb 3 17:31:49 2020 +1000 Revert "GROOVY-4694: Move AstBuilderTransformation Global xForm to separate module" This reverts commit 995053bd89477e605637b26884adba5051141de4. --- settings.gradle | 3 +- .../ast/builder/AstBuilderTransformation.java | 1 - ...org.codehaus.groovy.transform.ASTTransformation | 3 + src/spec/doc/core-domain-specific-languages.adoc | 2 +- src/spec/test/CustomizersTest.groovy | 19 +++ .../test/groovy/bugs/Groovy4272Bug.groovy | 0 .../test/groovy/bugs/Groovy5025Bug.groovy | 4 +- .../test/groovy/bugs/MyConstants4272.java | 0 .../bugs/MyConstantsASTTransformation4272.groovy | 0 .../groovy/ast/CodeVisitorSupportTest.groovy | 0 .../ast/builder/AstBuilderFromCodeTest.groovy | 0 .../builder/AstBuilderFromSpecificationTest.groovy | 0 .../ast/builder/AstBuilderFromStringTest.groovy | 0 .../groovy/ast/builder/WithAstBuilder.groovy | 0 .../AstBuilderFromCodePackageImportTest.groovy | 0 .../ASTTransformationCustomizerTest.groovy | 101 +++++++++++- subprojects/groovy-astbuilder/build.gradle | 23 --- .../ast/builder/AstBuilderTransformation.java | 183 --------------------- ...org.codehaus.groovy.transform.ASTTransformation | 17 -- .../src/spec/test/CustomizersTest.groovy | 45 ----- .../ASTTransformationCustomizerTest.groovy | 128 -------------- 21 files changed, 120 insertions(+), 409 deletions(-) diff --git a/settings.gradle b/settings.gradle index 11455fe..5e23353 100644 --- a/settings.gradle +++ b/settings.gradle @@ -30,7 +30,6 @@ gradleEnterprise { } def subprojects = ['groovy-ant', - 'groovy-astbuilder', 'groovy-bsf', 'groovy-cli-commons', 'groovy-cli-picocli', @@ -44,7 +43,6 @@ def subprojects = ['groovy-ant', 'groovy-jmx', 'groovy-json', 'groovy-jsr223', - 'groovy-macro', 'groovy-nio', 'groovy-servlet', 'groovy-sql', @@ -54,6 +52,7 @@ def subprojects = ['groovy-ant', 'groovy-test-junit5', 'groovy-testng', 'groovy-xml', + 'groovy-macro', 'groovy-yaml', 'performance', 'binary-compatibility' diff --git a/src/main/java/org/codehaus/groovy/ast/builder/AstBuilderTransformation.java b/src/main/java/org/codehaus/groovy/ast/builder/AstBuilderTransformation.java index 6d9030c..be192f7 100644 --- a/src/main/java/org/codehaus/groovy/ast/builder/AstBuilderTransformation.java +++ b/src/main/java/org/codehaus/groovy/ast/builder/AstBuilderTransformation.java @@ -48,7 +48,6 @@ import java.util.List; * approach's responsibility to remove the BlockStatement created * by the label. */ -@Deprecated @GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS) public class AstBuilderTransformation extends MethodCallTransformation { diff --git a/src/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation b/src/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation index 3836360..734b814 100644 --- a/src/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation +++ b/src/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation @@ -15,3 +15,6 @@ # global transformation to handle @Grab annotation groovy.grape.GrabAnnotationTransformation + +#global transformation for AST Builder +org.codehaus.groovy.ast.builder.AstBuilderTransformation diff --git a/src/spec/doc/core-domain-specific-languages.adoc b/src/spec/doc/core-domain-specific-languages.adoc index 7bf4c05..06ca6a0 100644 --- a/src/spec/doc/core-domain-specific-languages.adoc +++ b/src/spec/doc/core-domain-specific-languages.adoc @@ -699,7 +699,7 @@ give it a `ClosureExpression`, like in the following example: [source,groovy] -------------------------------------------------------------------------------------------------------------- -include::{projectdir}/subprojects/groovy-astbuilder/src/spec/test/CustomizersTest.groovy[tags=ast_cz_closure,indent=0] +include::{projectdir}/src/spec/test/CustomizersTest.groovy[tags=ast_cz_closure,indent=0] -------------------------------------------------------------------------------------------------------------- For a complete list of options, please refer to gapi:org.codehaus.groovy.control.customizers.ASTTransformationCustomizer[] diff --git a/src/spec/test/CustomizersTest.groovy b/src/spec/test/CustomizersTest.groovy index 6bf5fdf..27b0a3a 100644 --- a/src/spec/test/CustomizersTest.groovy +++ b/src/spec/test/CustomizersTest.groovy @@ -102,6 +102,25 @@ class CustomizersTest extends GroovyTestCase { ''' } + void testAstTransformationCustomizerWithClosureExpression() { + // tag::ast_cz_closure[] + def configuration = new CompilerConfiguration() + def expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) { -> true }.expression[0] + def customizer = new ASTTransformationCustomizer(ConditionalInterrupt, value: expression, thrown: SecurityException) + configuration.addCompilationCustomizers(customizer) + def shell = new GroovyShell(configuration) + shouldFail(SecurityException) { + shell.evaluate(""" + // equivalent to adding @ConditionalInterrupt(value={true}, thrown: SecurityException) + class MyClass { + void doIt() { } + } + new MyClass().doIt() + """) + } + // end::ast_cz_closure[] + } + void testSecureASTCustomizer() { // tag::secure_cz[] def scz = new SecureASTCustomizer() diff --git a/subprojects/groovy-astbuilder/src/test/groovy/bugs/Groovy4272Bug.groovy b/src/test/groovy/bugs/Groovy4272Bug.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/bugs/Groovy4272Bug.groovy rename to src/test/groovy/bugs/Groovy4272Bug.groovy diff --git a/subprojects/groovy-astbuilder/src/test/groovy/bugs/Groovy5025Bug.groovy b/src/test/groovy/bugs/Groovy5025Bug.groovy similarity index 89% rename from subprojects/groovy-astbuilder/src/test/groovy/bugs/Groovy5025Bug.groovy rename to src/test/groovy/bugs/Groovy5025Bug.groovy index d724fad..5cc6cd3 100644 --- a/subprojects/groovy-astbuilder/src/test/groovy/bugs/Groovy5025Bug.groovy +++ b/src/test/groovy/bugs/Groovy5025Bug.groovy @@ -23,7 +23,7 @@ import groovy.test.GroovyTestCase class Groovy5025Bug extends GroovyTestCase { void testDisableAstBuilder() { def config = new org.codehaus.groovy.control.CompilerConfiguration() - config.disabledGlobalASTTransformations = ['org.apache.groovy.ast.builder.AstBuilderTransformation'] + config.disabledGlobalASTTransformations = ['org.codehaus.groovy.ast.builder.AstBuilderTransformation'] def script = ''' new org.codehaus.groovy.ast.builder.AstBuilder().buildFromCode { "Hello" } ''' @@ -32,7 +32,7 @@ class Groovy5025Bug extends GroovyTestCase { assert shell.evaluate(script).class == ArrayList shell = new GroovyShell(config) - shouldFail(IllegalStateException) { + shouldFail { shell.evaluate(script) } } diff --git a/subprojects/groovy-astbuilder/src/test/groovy/bugs/MyConstants4272.java b/src/test/groovy/bugs/MyConstants4272.java similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/bugs/MyConstants4272.java rename to src/test/groovy/bugs/MyConstants4272.java diff --git a/subprojects/groovy-astbuilder/src/test/groovy/bugs/MyConstantsASTTransformation4272.groovy b/src/test/groovy/bugs/MyConstantsASTTransformation4272.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/bugs/MyConstantsASTTransformation4272.groovy rename to src/test/groovy/bugs/MyConstantsASTTransformation4272.groovy diff --git a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy b/src/test/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy rename to src/test/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy diff --git a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/AstBuilderFromCodeTest.groovy b/src/test/org/codehaus/groovy/ast/builder/AstBuilderFromCodeTest.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/AstBuilderFromCodeTest.groovy rename to src/test/org/codehaus/groovy/ast/builder/AstBuilderFromCodeTest.groovy diff --git a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/AstBuilderFromSpecificationTest.groovy b/src/test/org/codehaus/groovy/ast/builder/AstBuilderFromSpecificationTest.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/AstBuilderFromSpecificationTest.groovy rename to src/test/org/codehaus/groovy/ast/builder/AstBuilderFromSpecificationTest.groovy diff --git a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/AstBuilderFromStringTest.groovy b/src/test/org/codehaus/groovy/ast/builder/AstBuilderFromStringTest.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/AstBuilderFromStringTest.groovy rename to src/test/org/codehaus/groovy/ast/builder/AstBuilderFromStringTest.groovy diff --git a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/WithAstBuilder.groovy b/src/test/org/codehaus/groovy/ast/builder/WithAstBuilder.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/WithAstBuilder.groovy rename to src/test/org/codehaus/groovy/ast/builder/WithAstBuilder.groovy diff --git a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/testpackage/AstBuilderFromCodePackageImportTest.groovy b/src/test/org/codehaus/groovy/ast/builder/testpackage/AstBuilderFromCodePackageImportTest.groovy similarity index 100% rename from subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/ast/builder/testpackage/AstBuilderFromCodePackageImportTest.groovy rename to src/test/org/codehaus/groovy/ast/builder/testpackage/AstBuilderFromCodePackageImportTest.groovy diff --git a/src/test/org/codehaus/groovy/control/customizers/ASTTransformationCustomizerTest.groovy b/src/test/org/codehaus/groovy/control/customizers/ASTTransformationCustomizerTest.groovy index b861ed8..90c252d 100644 --- a/src/test/org/codehaus/groovy/control/customizers/ASTTransformationCustomizerTest.groovy +++ b/src/test/org/codehaus/groovy/control/customizers/ASTTransformationCustomizerTest.groovy @@ -20,20 +20,29 @@ package org.codehaus.groovy.control.customizers import groovy.test.GroovyTestCase import groovy.transform.TimedInterrupt -import groovy.util.logging.Log -import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.expr.ClassExpression import org.codehaus.groovy.ast.expr.PropertyExpression -import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.CompilerConfiguration -import org.codehaus.groovy.control.SourceUnit -import org.codehaus.groovy.transform.ASTTransformation -import org.codehaus.groovy.transform.GroovyASTTransformation +import groovy.util.logging.Log import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicBoolean import java.util.logging.Logger +import org.codehaus.groovy.transform.ASTTransformation +import org.codehaus.groovy.transform.GroovyASTTransformation +import org.codehaus.groovy.control.CompilePhase +import java.util.concurrent.atomic.AtomicBoolean +import org.codehaus.groovy.ast.ASTNode +import org.codehaus.groovy.control.SourceUnit +import java.lang.annotation.Retention +import java.lang.annotation.Target +import org.codehaus.groovy.transform.GroovyASTTransformationClass +import java.lang.annotation.ElementType +import java.lang.annotation.RetentionPolicy +import org.codehaus.groovy.ast.ClassNode +import org.objectweb.asm.Opcodes +import org.codehaus.groovy.ast.builder.AstBuilder +import groovy.transform.ConditionalInterrupt /** * Tests the {@link ASTTransformationCustomizer}. @@ -88,6 +97,62 @@ class ASTTransformationCustomizerTest extends GroovyTestCase { } } + void testLocalTransformationWithClosureAnnotationParameter() { + // add @Contract({distance = 1 }) + customizer = new ASTTransformationCustomizer(Contract) + final expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) {-> + distance = 1 + }.expression[0] + customizer.annotationParameters = [value: expression] + configuration.addCompilationCustomizers(customizer) + def shell = new GroovyShell(configuration) + def result = shell.evaluate(""" + class MyClass { + int distance + MyClass() {} + } + new MyClass() + """) + assert result.distance == 1 + } + + void testLocalTransformationWithClosureAnnotationParameter_notAnnotatedAsASTInterface() { + // add @Contract2({distance = 1 }) + customizer = new ASTTransformationCustomizer(Contract2, "org.codehaus.groovy.control.customizers.ContractAnnotation") + final expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) {-> + distance = 1 + }.expression[0] + customizer.annotationParameters = [value: expression] + configuration.addCompilationCustomizers(customizer) + def shell = new GroovyShell(configuration) + def result = shell.evaluate(""" + class MyClass { + int distance + MyClass() {} + } + new MyClass() + """) + assert result.distance == 1 + } + + void testLocalTransformationWithClassAnnotationParameter() { + // add @ConditionalInterrupt(value={ true }, thrown=SecurityException) + final expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) {-> + true + }.expression[0] + customizer = new ASTTransformationCustomizer(ConditionalInterrupt, value:expression, thrown:SecurityException) + configuration.addCompilationCustomizers(customizer) + def shell = new GroovyShell(configuration) + shouldFail(SecurityException) { + shell.evaluate(""" + class MyClass { + void doIt() { } + } + new MyClass().doIt() + """) + } + } + void testGlobalTransformation() { final TestTransformation transformation = new TestTransformation() customizer = new ASTTransformationCustomizer(transformation) @@ -153,3 +218,25 @@ interrupted''' } } + +@Retention(RetentionPolicy.SOURCE) +@Target([ElementType.TYPE]) +@GroovyASTTransformationClass("org.codehaus.groovy.control.customizers.ContractAnnotation") +protected @interface Contract { + Class value(); +} + +@GroovyASTTransformation(phase=CompilePhase.CONVERSION) +protected class ContractAnnotation implements ASTTransformation, Opcodes { + void visit(ASTNode[] nodes, SourceUnit source) { + def node = nodes[0] + def member = node.getMember("value") + ((ClassNode)nodes[1]).getDeclaredConstructors()[0].code = member.code + } +} + +@Retention(RetentionPolicy.SOURCE) +@Target([ElementType.TYPE]) +protected @interface Contract2 { + Class value(); +} diff --git a/subprojects/groovy-astbuilder/build.gradle b/subprojects/groovy-astbuilder/build.gradle deleted file mode 100644 index 1e6b820..0000000 --- a/subprojects/groovy-astbuilder/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -dependencies { - implementation rootProject - testImplementation project(':groovy-test') - testImplementation rootProject.sourceSets.test.runtimeClasspath -} diff --git a/subprojects/groovy-astbuilder/src/main/java/org/apache/groovy/ast/builder/AstBuilderTransformation.java b/subprojects/groovy-astbuilder/src/main/java/org/apache/groovy/ast/builder/AstBuilderTransformation.java deleted file mode 100644 index 63a6555..0000000 --- a/subprojects/groovy-astbuilder/src/main/java/org/apache/groovy/ast/builder/AstBuilderTransformation.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.groovy.ast.builder; - -import org.codehaus.groovy.ast.ASTNode; -import org.codehaus.groovy.ast.GroovyCodeVisitor; -import org.codehaus.groovy.ast.ImportNode; -import org.codehaus.groovy.ast.MethodCallTransformation; -import org.codehaus.groovy.ast.MethodInvocationTrap; -import org.codehaus.groovy.ast.expr.ArgumentListExpression; -import org.codehaus.groovy.ast.expr.ClosureExpression; -import org.codehaus.groovy.ast.expr.ConstantExpression; -import org.codehaus.groovy.ast.expr.Expression; -import org.codehaus.groovy.ast.expr.MethodCallExpression; -import org.codehaus.groovy.ast.expr.TupleExpression; -import org.codehaus.groovy.control.CompilePhase; -import org.codehaus.groovy.control.SourceUnit; -import org.codehaus.groovy.control.io.ReaderSource; -import org.codehaus.groovy.transform.GroovyASTTransformation; - -import java.util.ArrayList; -import java.util.List; - -/** - * Transformation to capture ASTBuilder from code statements. - * <p> - * The AstBuilder "from code" approach is used with a single Closure - * parameter. This transformation converts the ClosureExpression back - * into source code and rewrites the AST so that the "from string" - * builder is invoked on the source. In order for this to work, the - * closure source must be given a goto label. It is the "from string" - * approach's responsibility to remove the BlockStatement created - * by the label. - */ -@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS) -public class AstBuilderTransformation extends MethodCallTransformation { - - @Override - protected GroovyCodeVisitor getTransformer(ASTNode[] nodes, SourceUnit sourceUnit) { - // todo : are there other import types that can be specified? - return new AstBuilderInvocationTrap( - sourceUnit.getAST().getImports(), - sourceUnit.getAST().getStarImports(), - sourceUnit.getSource(), - sourceUnit - ); - } - - /** - * This class traps invocations of AstBuilder.build(CompilePhase, boolean, Closure) and converts - * the contents of the closure into expressions by reading the source of the Closure and sending - * that as a String to AstBuilder.build(String, CompilePhase, boolean) at runtime. - */ - private static class AstBuilderInvocationTrap extends MethodInvocationTrap { - - private final List<String> factoryTargets = new ArrayList<>(); - - /** - * Creates the trap and captures all the ways in which a class may be referenced via imports. - * - * @param imports all the imports from the source - * @param importPackages all the imported packages from the source - * @param source the reader source that contains source for the SourceUnit - * @param sourceUnit the source unit being compiled. Used for error messages. - */ - AstBuilderInvocationTrap(List<ImportNode> imports, List<ImportNode> importPackages, ReaderSource source, SourceUnit sourceUnit) { - super(source, sourceUnit); - - // factory type may be references as fully qualified, an import, or an alias - factoryTargets.add("org.codehaus.groovy.ast.builder.AstBuilder");//default package - - if (imports != null) { - for (ImportNode importStatement : imports) { - if ("org.codehaus.groovy.ast.builder.AstBuilder".equals(importStatement.getType().getName())) { - factoryTargets.add(importStatement.getAlias()); - } - } - } - - if (importPackages != null) { - for (ImportNode importPackage : importPackages) { - if ("org.codehaus.groovy.ast.builder.".equals(importPackage.getPackageName())) { - factoryTargets.add("AstBuilder"); - break; - } - } - } - } - - @Override - protected boolean handleTargetMethodCallExpression(MethodCallExpression call) { - ClosureExpression closureExpression = getClosureArgument(call); - List<Expression> otherArgs = getNonClosureArguments(call); - String source = convertClosureToSource(closureExpression); - - // parameter order is build(CompilePhase, boolean, String) - otherArgs.add(new ConstantExpression(source)); - call.setArguments(new ArgumentListExpression(otherArgs)); - call.setMethod(new ConstantExpression("buildFromBlock")); - call.setSpreadSafe(false); - call.setSafe(false); - call.setImplicitThis(false); - - return false; - } - - private static List<Expression> getNonClosureArguments(MethodCallExpression call) { - List<Expression> result = new ArrayList<>(); - if (call.getArguments() instanceof TupleExpression) { - for (ASTNode node : ((TupleExpression) call.getArguments()).getExpressions()) { - if (!(node instanceof ClosureExpression)) { - result.add((Expression) node); - } - } - } - return result; - } - - private static ClosureExpression getClosureArgument(MethodCallExpression call) { - - if (call.getArguments() instanceof TupleExpression) { - for (ASTNode node : ((TupleExpression) call.getArguments()).getExpressions()) { - if (node instanceof ClosureExpression) { - return (ClosureExpression) node; - } - } - } - return null; - } - - /** - * Looks for method calls on the AstBuilder class called build that take - * a Closure as parameter. This is all needed b/c build is overloaded. - * - * @param call the method call expression, may not be null - */ - @Override - protected boolean isBuildInvocation(MethodCallExpression call) { - if (call == null) throw new IllegalArgumentException("Null: call"); - - // is method name correct? - if (call.getMethod() instanceof ConstantExpression && "buildFromCode".equals(((ConstantExpression) call.getMethod()).getValue())) { - - // is method object correct type? - if (call.getObjectExpression() != null && call.getObjectExpression().getType() != null) { - String name = call.getObjectExpression().getType().getName(); - if (name != null && !"".equals(name) && factoryTargets.contains(name)) { - - // is one of the arguments a closure? - if (call.getArguments() != null && call.getArguments() instanceof TupleExpression) { - if (((TupleExpression) call.getArguments()).getExpressions() != null) { - for (ASTNode node : ((TupleExpression) call.getArguments()).getExpressions()) { - if (node instanceof ClosureExpression) { - return true; - } - } - } - } - } - } - } - return false; - } - } -} - - diff --git a/subprojects/groovy-astbuilder/src/main/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation b/subprojects/groovy-astbuilder/src/main/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation deleted file mode 100644 index 94f88b4..0000000 --- a/subprojects/groovy-astbuilder/src/main/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation +++ /dev/null @@ -1,17 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#global transformation for AST Builder -org.apache.groovy.ast.builder.AstBuilderTransformation diff --git a/subprojects/groovy-astbuilder/src/spec/test/CustomizersTest.groovy b/subprojects/groovy-astbuilder/src/spec/test/CustomizersTest.groovy deleted file mode 100644 index 4615787..0000000 --- a/subprojects/groovy-astbuilder/src/spec/test/CustomizersTest.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import groovy.test.GroovyTestCase -import groovy.transform.ConditionalInterrupt -import org.codehaus.groovy.ast.builder.AstBuilder -import org.codehaus.groovy.control.CompilePhase -import org.codehaus.groovy.control.CompilerConfiguration -import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer - -class CustomizersTest extends GroovyTestCase { - void testAstTransformationCustomizerWithClosureExpression() { - // tag::ast_cz_closure[] - def configuration = new CompilerConfiguration() - def expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) { -> true }.expression[0] - def customizer = new ASTTransformationCustomizer(ConditionalInterrupt, value: expression, thrown: SecurityException) - configuration.addCompilationCustomizers(customizer) - def shell = new GroovyShell(configuration) - shouldFail(SecurityException) { - shell.evaluate(""" - // equivalent to adding @ConditionalInterrupt(value={true}, thrown: SecurityException) - class MyClass { - void doIt() { } - } - new MyClass().doIt() - """) - } - // end::ast_cz_closure[] - } -} diff --git a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/control/customizers/ASTTransformationCustomizerTest.groovy b/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/control/customizers/ASTTransformationCustomizerTest.groovy deleted file mode 100644 index f378ce1..0000000 --- a/subprojects/groovy-astbuilder/src/test/groovy/org/codehaus/groovy/control/customizers/ASTTransformationCustomizerTest.groovy +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.codehaus.groovy.control.customizers - -import groovy.test.GroovyTestCase -import groovy.transform.ConditionalInterrupt -import org.codehaus.groovy.ast.ASTNode -import org.codehaus.groovy.ast.ClassNode -import org.codehaus.groovy.ast.builder.AstBuilder -import org.codehaus.groovy.control.CompilePhase -import org.codehaus.groovy.control.CompilerConfiguration -import org.codehaus.groovy.control.SourceUnit -import org.codehaus.groovy.transform.ASTTransformation -import org.codehaus.groovy.transform.GroovyASTTransformation -import org.codehaus.groovy.transform.GroovyASTTransformationClass -import org.objectweb.asm.Opcodes - -import java.lang.annotation.ElementType -import java.lang.annotation.Retention -import java.lang.annotation.RetentionPolicy -import java.lang.annotation.Target - -/** - * Tests the {@link ASTTransformationCustomizer} for cases which rely on AST Builder. - */ -class ASTTransformationCustomizerTest extends GroovyTestCase { - CompilerConfiguration configuration - ASTTransformationCustomizer customizer - - void setUp() { - configuration = new CompilerConfiguration() - } - - void testLocalTransformationWithClosureAnnotationParameter() { - // add @Contract({distance = 1 }) - customizer = new ASTTransformationCustomizer(Contract) - final expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) {-> - distance = 1 - }.expression[0] - customizer.annotationParameters = [value: expression] - configuration.addCompilationCustomizers(customizer) - def shell = new GroovyShell(configuration) - def result = shell.evaluate(""" - class MyClass { - int distance - MyClass() {} - } - new MyClass() - """) - assert result.distance == 1 - } - - void testLocalTransformationWithClosureAnnotationParameter_notAnnotatedAsASTInterface() { - // add @Contract2({distance = 1 }) - customizer = new ASTTransformationCustomizer(Contract2, "org.codehaus.groovy.control.customizers.ContractAnnotation") - final expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) {-> - distance = 1 - }.expression[0] - customizer.annotationParameters = [value: expression] - configuration.addCompilationCustomizers(customizer) - def shell = new GroovyShell(configuration) - def result = shell.evaluate(""" - class MyClass { - int distance - MyClass() {} - } - new MyClass() - """) - assert result.distance == 1 - } - - void testLocalTransformationWithClassAnnotationParameter() { - // add @ConditionalInterrupt(value={ true }, thrown=SecurityException) - final expression = new AstBuilder().buildFromCode(CompilePhase.CONVERSION) {-> - true - }.expression[0] - customizer = new ASTTransformationCustomizer(ConditionalInterrupt, value:expression, thrown:SecurityException) - configuration.addCompilationCustomizers(customizer) - def shell = new GroovyShell(configuration) - shouldFail(SecurityException) { - shell.evaluate(""" - class MyClass { - void doIt() { } - } - new MyClass().doIt() - """) - } - } - -} - -@Retention(RetentionPolicy.SOURCE) -@Target([ElementType.TYPE]) -@GroovyASTTransformationClass("org.codehaus.groovy.control.customizers.ContractAnnotation") -protected @interface Contract { - Class value(); -} - -@GroovyASTTransformation(phase=CompilePhase.CONVERSION) -protected class ContractAnnotation implements ASTTransformation, Opcodes { - void visit(ASTNode[] nodes, SourceUnit source) { - def node = nodes[0] - def member = node.getMember("value") - ((ClassNode)nodes[1]).getDeclaredConstructors()[0].code = member.code - } -} - -@Retention(RetentionPolicy.SOURCE) -@Target([ElementType.TYPE]) -protected @interface Contract2 { - Class value(); -}
