You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/11/29 18:30:30 UTC
[groovy] branch GROOVY_3_0_X updated: Minor refactoring: implement
`AstStringCompiler` in Java
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
new 4ac722d Minor refactoring: implement `AstStringCompiler` in Java
4ac722d is described below
commit 4ac722dde00b13591d79fdd4b2a426f29154afc7
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Nov 30 01:15:40 2019 +0800
Minor refactoring: implement `AstStringCompiler` in Java
(cherry picked from commit ae9beecc6f753b7d13cec9747b3956c6ca7a609b)
---
.../groovy/ast/builder/AstStringCompiler.groovy | 71 --------------------
.../groovy/ast/builder/AstStringCompiler.java | 77 ++++++++++++++++++++++
2 files changed, 77 insertions(+), 71 deletions(-)
diff --git a/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.groovy b/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.groovy
deleted file mode 100644
index a3818de..0000000
--- a/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.groovy
+++ /dev/null
@@ -1,71 +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.ast.builder
-
-import groovy.transform.CompileStatic
-import groovy.transform.PackageScope
-import org.codehaus.groovy.ast.ASTNode
-import org.codehaus.groovy.ast.ModuleNode
-import org.codehaus.groovy.control.CompilationUnit
-import org.codehaus.groovy.control.CompilePhase
-import org.codehaus.groovy.control.CompilerConfiguration
-
-import java.security.AccessController
-import java.security.PrivilegedAction
-
-/**
- * This class handles converting Strings to ASTNode lists.
- */
-@CompileStatic
-@PackageScope
-class AstStringCompiler {
-
- /**
- * Performs the String source to {@link List} of {@link ASTNode}.
- *
- * @param script
- * a Groovy script in String form
- * @param compilePhase
- * the int based CompilePhase to compile it to.
- * @param statementsOnly
- */
- List<ASTNode> compile(String script, CompilePhase compilePhase, boolean statementsOnly) {
- final scriptClassName = makeScriptClassName()
- GroovyCodeSource codeSource = new GroovyCodeSource(script, "${scriptClassName}.groovy", '/groovy/script')
- CompilationUnit cu = new CompilationUnit(CompilerConfiguration.DEFAULT, codeSource.codeSource, AccessController.doPrivileged({
- new GroovyClassLoader()
- } as PrivilegedAction<GroovyClassLoader>))
- cu.addSource(codeSource.name, script)
- cu.compile(compilePhase.phaseNumber)
- // collect all the ASTNodes into the result, possibly ignoring the script body if desired
- (List<ASTNode>) cu.AST.modules.inject([]) { List acc, ModuleNode node ->
- if (node.statementBlock) acc.add(node.statementBlock)
- node.classes?.each {
- if (!(statementsOnly && it.name == scriptClassName)) {
- acc << it
- }
- }
- acc
- }
- }
-
- private static String makeScriptClassName() {
- "Script${System.nanoTime()}"
- }
-}
diff --git a/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.java b/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.java
new file mode 100644
index 0000000..c48114e
--- /dev/null
+++ b/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.java
@@ -0,0 +1,77 @@
+/*
+ * 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.ast.builder;
+
+import groovy.lang.GroovyClassLoader;
+import groovy.lang.GroovyCodeSource;
+import org.codehaus.groovy.ast.ASTNode;
+import org.codehaus.groovy.ast.stmt.BlockStatement;
+import org.codehaus.groovy.control.CompilationUnit;
+import org.codehaus.groovy.control.CompilePhase;
+import org.codehaus.groovy.control.CompilerConfiguration;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * This class handles converting Strings to ASTNode lists.
+ */
+class AstStringCompiler {
+ /**
+ * Performs the String source to {@link java.util.List} of {@link ASTNode}.
+ *
+ * @param script
+ * a Groovy script in String form
+ * @param compilePhase
+ * the int based CompilePhase to compile it to.
+ * @param statementsOnly
+ */
+ public List<ASTNode> compile(String script, CompilePhase compilePhase, boolean statementsOnly) {
+ final String scriptClassName = makeScriptClassName();
+ GroovyCodeSource codeSource = new GroovyCodeSource(script, scriptClassName + ".groovy", "/groovy/script");
+ CompilationUnit cu = new CompilationUnit(CompilerConfiguration.DEFAULT, codeSource.getCodeSource(),
+ AccessController.doPrivileged((PrivilegedAction<GroovyClassLoader>) GroovyClassLoader::new));
+ cu.addSource(codeSource.getName(), script);
+ cu.compile(compilePhase.getPhaseNumber());
+
+ // collect all the ASTNodes into the result, possibly ignoring the script body if desired
+ List<ASTNode> result = cu.getAST().getModules().stream().reduce(new LinkedList<>(), (acc, node) -> {
+ BlockStatement statementBlock = node.getStatementBlock();
+ if (null != statementBlock) {
+ acc.add(statementBlock);
+ }
+ acc.addAll(
+ node.getClasses().stream()
+ .filter(c -> !(statementsOnly && scriptClassName.equals(c.getName())))
+ .collect(Collectors.toList())
+ );
+
+ return acc;
+ }, (o1, o2) -> o1);
+
+ return result;
+ }
+
+ private static String makeScriptClassName() {
+ return "Script" + System.nanoTime();
+ }
+}