Skip to content

Commit 653d076

Browse files
committed
draft version
0 parents  commit 653d076

File tree

14 files changed

+853
-0
lines changed

14 files changed

+853
-0
lines changed

.gitignore

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
HELP.md
2+
target/
3+
!.mvn/wrapper/maven-wrapper.jar
4+
!**/src/main/**
5+
!**/src/test/**
6+
7+
### STS ###
8+
.apt_generated
9+
.classpath
10+
.factorypath
11+
.project
12+
.settings
13+
.springBeans
14+
.sts4-cache
15+
16+
### IntelliJ IDEA ###
17+
.idea
18+
*.iws
19+
*.iml
20+
*.ipr
21+
22+
### NetBeans ###
23+
/nbproject/private/
24+
/nbbuild/
25+
/dist/
26+
/nbdist/
27+
/.nb-gradle/
28+
build/
29+
30+
### VS Code ###
31+
.vscode/

pom.xml

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>com.antkorwin</groupId>
5+
<artifactId>better-strings</artifactId>
6+
<packaging>jar</packaging>
7+
<version>1.0</version>
8+
<name>BetterStrings Java Plugin</name>
9+
<url>http://maven.apache.org</url>
10+
11+
<properties>
12+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
14+
<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
15+
<java.version>1.8</java.version>
16+
17+
<junit.vintage.version>5.3.2</junit.vintage.version>
18+
<junit-jupiter.version>5.3.2</junit-jupiter.version>
19+
<junit-platform.version>1.3.2</junit-platform.version>
20+
</properties>
21+
22+
<dependencies>
23+
24+
<dependency>
25+
<groupId>com.sun</groupId>
26+
<artifactId>tools</artifactId>
27+
<version>1.4.2</version>
28+
<scope>system</scope>
29+
<systemPath>${java.home}/../lib/tools.jar</systemPath>
30+
</dependency>
31+
32+
<!-- Junit 5 -->
33+
<dependency>
34+
<groupId>org.junit.jupiter</groupId>
35+
<artifactId>junit-jupiter-api</artifactId>
36+
<version>${junit-jupiter.version}</version>
37+
<scope>test</scope>
38+
</dependency>
39+
<dependency>
40+
<groupId>org.junit.jupiter</groupId>
41+
<artifactId>junit-jupiter-engine</artifactId>
42+
<version>${junit-jupiter.version}</version>
43+
<scope>test</scope>
44+
</dependency>
45+
<dependency>
46+
<groupId>org.junit.platform</groupId>
47+
<artifactId>junit-platform-engine</artifactId>
48+
<version>${junit-platform.version}</version>
49+
<scope>test</scope>
50+
</dependency>
51+
<dependency>
52+
<groupId>org.junit.platform</groupId>
53+
<artifactId>junit-platform-launcher</artifactId>
54+
<version>${junit-platform.version}</version>
55+
<scope>test</scope>
56+
</dependency>
57+
<dependency>
58+
<groupId>org.assertj</groupId>
59+
<artifactId>assertj-core</artifactId>
60+
<version>3.11.1</version>
61+
<scope>test</scope>
62+
</dependency>
63+
<!-- Junit 5 -->
64+
65+
</dependencies>
66+
67+
68+
<build>
69+
<plugins>
70+
71+
<plugin>
72+
<groupId>org.apache.maven.plugins</groupId>
73+
<artifactId>maven-compiler-plugin</artifactId>
74+
<version>${maven-compiler-plugin.version}</version>
75+
<configuration>
76+
<source>${java.version}</source>
77+
<target>${java.version}</target>
78+
<compilerArgument>-proc:none</compilerArgument>
79+
<showWarnings>true</showWarnings>
80+
</configuration>
81+
<executions>
82+
<execution>
83+
<id>default-compile</id>
84+
<goals>
85+
<goal>compile</goal>
86+
</goals>
87+
</execution>
88+
</executions>
89+
</plugin>
90+
91+
<plugin>
92+
<artifactId>maven-jar-plugin</artifactId>
93+
<version>2.4</version>
94+
</plugin>
95+
96+
<plugin>
97+
<groupId>org.apache.maven.plugins</groupId>
98+
<artifactId>maven-surefire-plugin</artifactId>
99+
<version>2.22.2</version>
100+
<configuration>
101+
<reportFormat>plain</reportFormat>
102+
<includes>
103+
<include>**/*Test*.java</include>
104+
<include>**/*IT*.java</include>
105+
</includes>
106+
</configuration>
107+
</plugin>
108+
109+
</plugins>
110+
111+
<resources>
112+
<resource>
113+
<directory>${project.basedir}/src/main/resources</directory>
114+
<filtering>true</filtering>
115+
</resource>
116+
</resources>
117+
<testResources>
118+
<testResource>
119+
<directory>${project.basedir}/src/test/resources</directory>
120+
<filtering>true</filtering>
121+
</testResource>
122+
</testResources>
123+
</build>
124+
125+
</project>
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.antkorwin.betterstrings;
2+
3+
import java.util.Set;
4+
import javax.annotation.processing.AbstractProcessor;
5+
import javax.annotation.processing.Messager;
6+
import javax.annotation.processing.ProcessingEnvironment;
7+
import javax.annotation.processing.RoundEnvironment;
8+
import javax.annotation.processing.SupportedAnnotationTypes;
9+
import javax.annotation.processing.SupportedSourceVersion;
10+
import javax.lang.model.SourceVersion;
11+
import javax.lang.model.element.Element;
12+
import javax.lang.model.element.ElementKind;
13+
import javax.lang.model.element.TypeElement;
14+
import javax.tools.Diagnostic;
15+
16+
import com.antkorwin.betterstrings.ast.InnerStringVarsAstTranslator;
17+
import com.sun.source.util.Trees;
18+
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
19+
import com.sun.tools.javac.tree.JCTree;
20+
import com.sun.tools.javac.util.Context;
21+
22+
/**
23+
* Created on 2019-09-02
24+
* <p>
25+
* TODO: replace on the JavaDoc
26+
*
27+
* @author Korovin Anatoliy
28+
*/
29+
@SupportedAnnotationTypes("*")
30+
@SupportedSourceVersion(SourceVersion.RELEASE_8)
31+
public class BetterStringsProcessor extends AbstractProcessor {
32+
33+
private JavacProcessingEnvironment env;
34+
private Messager messager;
35+
36+
@Override
37+
public synchronized void init(ProcessingEnvironment processingEnv) {
38+
messager = processingEnv.getMessager();
39+
env = (JavacProcessingEnvironment) processingEnv;
40+
super.init(processingEnv);
41+
printBanner();
42+
}
43+
44+
45+
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
46+
47+
if (roundEnv.processingOver()) {
48+
return false;
49+
}
50+
51+
Context context = env.getContext();
52+
Trees trees = Trees.instance(env);
53+
54+
for (Element codeElement : roundEnv.getRootElements()) {
55+
56+
if (codeElement.getKind() != ElementKind.CLASS) {
57+
//TODO: check working with enums
58+
continue;
59+
}
60+
JCTree tree = (JCTree) trees.getPath(codeElement).getCompilationUnit();
61+
new InnerStringVarsAstTranslator(context).translate(tree);
62+
}
63+
64+
return false;
65+
}
66+
67+
@Override
68+
public SourceVersion getSupportedSourceVersion() {
69+
return SourceVersion.latestSupported();
70+
}
71+
72+
private void printBanner() {
73+
String banner = "\n" +
74+
"___ ____ ___ ___ ____ ____ ____ ___ ____ _ _ _ ____ ____ \n" +
75+
"|__] |___ | | |___ |__/ [__ | |__/ | |\\ | | __ [__ \n" +
76+
"|__] |___ | | |___ | \\ ___] | | \\ | | \\| |__] ___] \n" +
77+
" v1.0 String Interpolation Java Plugin, by Anatoliy Korovin ";
78+
79+
messager.printMessage(Diagnostic.Kind.NOTE, banner);
80+
}
81+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.antkorwin.betterstrings;
2+
3+
4+
public @interface DisabledStringInterpolation {
5+
6+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.antkorwin.betterstrings.ast;
2+
3+
4+
import java.io.IOException;
5+
import java.net.URI;
6+
import java.util.Arrays;
7+
import javax.tools.JavaCompiler;
8+
import javax.tools.JavaFileManager;
9+
import javax.tools.JavaFileObject;
10+
import javax.tools.SimpleJavaFileObject;
11+
import javax.tools.ToolProvider;
12+
13+
import com.antkorwin.betterstrings.tokenizer.Token;
14+
import com.sun.source.tree.CompilationUnitTree;
15+
import com.sun.tools.javac.api.JavacTaskImpl;
16+
import com.sun.tools.javac.tree.JCTree;
17+
import com.sun.tools.javac.tree.TreeTranslator;
18+
import com.sun.tools.javac.util.Names;
19+
20+
public class ExpressionParser {
21+
22+
private final Names names;
23+
24+
public ExpressionParser(Names names) {
25+
this.names = names;
26+
}
27+
28+
29+
public JCTree.JCExpression parse(Token token) {
30+
CompilationUnitTree tree = getCompilationUnitTree(token.getValue());
31+
JCTree.JCClassDecl declr = (JCTree.JCClassDecl) tree.getTypeDecls().get(0);
32+
JCTree.JCVariableDecl field = (JCTree.JCVariableDecl) declr.getMembers().get(0);
33+
JCTree.JCExpression expression = field.getInitializer();
34+
expression.setPos(token.getOffset());
35+
expression.accept(new IdentResolver(token.getOffset()));
36+
return expression;
37+
}
38+
39+
private CompilationUnitTree getCompilationUnitTree(String code) {
40+
41+
JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
42+
JavaFileManager fm = tool.getStandardFileManager(null, null, null);
43+
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null,
44+
fm,
45+
null,
46+
null,
47+
null,
48+
Arrays.asList(new FakeJavaFileWrapper(code)));
49+
50+
try {
51+
return ct.parse().iterator().next();
52+
} catch (IOException e) {
53+
e.printStackTrace();
54+
throw new RuntimeException("Error while parsing expression in the string literal: " + code, e);
55+
}
56+
}
57+
58+
59+
private class FakeJavaFileWrapper extends SimpleJavaFileObject {
60+
61+
private String text;
62+
63+
public FakeJavaFileWrapper(String text) {
64+
super(URI.create("myfake:/Test.java"), JavaFileObject.Kind.SOURCE);
65+
this.text = "class Test { Object value = String.valueOf(" + text + "); }";
66+
}
67+
68+
@Override
69+
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
70+
return text;
71+
}
72+
}
73+
74+
75+
private class IdentResolver extends TreeTranslator {
76+
77+
private int offset;
78+
79+
public IdentResolver(int offset) {
80+
this.offset = offset;
81+
}
82+
83+
@Override
84+
public void visitIdent(JCTree.JCIdent jcIdent) {
85+
super.visitIdent(jcIdent);
86+
jcIdent.name = names.fromString(jcIdent.getName().toString());
87+
jcIdent.pos = offset;
88+
}
89+
90+
@Override
91+
public void visitSelect(JCTree.JCFieldAccess jcFieldAccess) {
92+
super.visitSelect(jcFieldAccess);
93+
jcFieldAccess.name = names.fromString(jcFieldAccess.name.toString());
94+
jcFieldAccess.pos = offset;
95+
}
96+
}
97+
}

0 commit comments

Comments
 (0)