From f19dfb61b68b47513bff646b7da7d6da879ea628 Mon Sep 17 00:00:00 2001 From: rcx Date: Sun, 7 Oct 2018 06:57:46 -0400 Subject: [PATCH 1/2] Parsing demo --- pom.xml | 5 + src/main/java/club/bytecode/the/jda/JDA.java | 5 +- .../the/jda/decompilers/CFRDecompiler.java | 6 + .../jda/decompilers/FernflowerDecompiler.java | 6 + .../the/jda/decompilers/JDADecompiler.java | 7 + .../jda/decompilers/ProcyonDecompiler.java | 7 +- .../bytecode/BytecodeDecompiler.java | 6 + .../gui/fileviewer/BytecodeSyntaxArea.java | 3 +- .../jda/gui/fileviewer/DecompileThread.java | 6 +- .../the/jda/gui/fileviewer/JDATextArea.java | 124 +++++++++++++++++- 10 files changed, 163 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index fcb187e..c611519 100644 --- a/pom.xml +++ b/pom.xml @@ -153,5 +153,10 @@ modasm 0.0.1-ALPHA + + com.github.javaparser + javaparser-symbol-solver-core + 3.6.24 + diff --git a/src/main/java/club/bytecode/the/jda/JDA.java b/src/main/java/club/bytecode/the/jda/JDA.java index 68a3b8a..d6d723c 100644 --- a/src/main/java/club/bytecode/the/jda/JDA.java +++ b/src/main/java/club/bytecode/the/jda/JDA.java @@ -581,7 +581,10 @@ public String getDescription() { } } - public static Function> searchCallback = JDA::search; + public static Function> constantSearchCallback = JDA::search; + public static Function> methodSearchCallback = JDA::search; + public static Function> fieldSearchCallback = JDA::search; + public static Function> classSearchCallback = JDA::search; public static List search(String needle) { List matches = new ArrayList<>(); diff --git a/src/main/java/club/bytecode/the/jda/decompilers/CFRDecompiler.java b/src/main/java/club/bytecode/the/jda/decompilers/CFRDecompiler.java index 2ea4654..839ccc2 100644 --- a/src/main/java/club/bytecode/the/jda/decompilers/CFRDecompiler.java +++ b/src/main/java/club/bytecode/the/jda/decompilers/CFRDecompiler.java @@ -3,6 +3,7 @@ import club.bytecode.the.jda.FileContainer; import club.bytecode.the.jda.JDA; import club.bytecode.the.jda.api.JDANamespace; +import club.bytecode.the.jda.gui.fileviewer.JDAJavaTokenizer; import club.bytecode.the.jda.settings.JDADecompilerSettings; import club.bytecode.the.jda.settings.JDADecompilerSettings.SettingsEntry; import org.benf.cfr.reader.bytecode.analysis.parse.utils.Pair; @@ -213,4 +214,9 @@ public static String doClass(DCCommonState dcCommonState, byte[] content1) { } return ""; } + + @Override + public String getTarget() { + return JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA; + } } diff --git a/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java b/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java index 212ff90..21e0df9 100644 --- a/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java +++ b/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java @@ -3,6 +3,7 @@ import club.bytecode.the.jda.FileContainer; import club.bytecode.the.jda.JDA; import club.bytecode.the.jda.api.JDANamespace; +import club.bytecode.the.jda.gui.fileviewer.JDAJavaTokenizer; import club.bytecode.the.jda.settings.JDADecompilerSettings.SettingsEntry; import club.bytecode.the.jda.settings.Setting; import org.jetbrains.java.decompiler.main.decompiler.BaseDecompiler; @@ -173,5 +174,10 @@ private Map generateFernflowerArgs() { } return options; } + + @Override + public String getTarget() { + return JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA; + } } diff --git a/src/main/java/club/bytecode/the/jda/decompilers/JDADecompiler.java b/src/main/java/club/bytecode/the/jda/decompilers/JDADecompiler.java index 02cf1d3..39d3d5b 100644 --- a/src/main/java/club/bytecode/the/jda/decompilers/JDADecompiler.java +++ b/src/main/java/club/bytecode/the/jda/decompilers/JDADecompiler.java @@ -21,6 +21,13 @@ public abstract class JDADecompiler implements JDANamespacedComponent { public abstract String decompileClassNode(FileContainer container, ClassNode cn); + /** + * BytecodeTokenizer.SYNTAX_STYLE_BYTECODE for bytecode + * JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA for java + * @return target (output) language + */ + public abstract String getTarget(); + public JDADecompilerSettings getSettings() { return settings; } diff --git a/src/main/java/club/bytecode/the/jda/decompilers/ProcyonDecompiler.java b/src/main/java/club/bytecode/the/jda/decompilers/ProcyonDecompiler.java index a2de140..4e8ef3b 100644 --- a/src/main/java/club/bytecode/the/jda/decompilers/ProcyonDecompiler.java +++ b/src/main/java/club/bytecode/the/jda/decompilers/ProcyonDecompiler.java @@ -3,6 +3,7 @@ import club.bytecode.the.jda.FileContainer; import club.bytecode.the.jda.JDA; import club.bytecode.the.jda.api.JDANamespace; +import club.bytecode.the.jda.gui.fileviewer.JDAJavaTokenizer; import club.bytecode.the.jda.settings.JDADecompilerSettings.SettingsEntry; import com.strobel.assembler.InputTypeLoader; import com.strobel.assembler.metadata.*; @@ -117,5 +118,9 @@ public boolean tryLoadType(String s, Buffer buffer) { return parseException(e); } } -} + @Override + public String getTarget() { + return JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA; + } +} diff --git a/src/main/java/club/bytecode/the/jda/decompilers/bytecode/BytecodeDecompiler.java b/src/main/java/club/bytecode/the/jda/decompilers/bytecode/BytecodeDecompiler.java index ec5d873..eeaedc2 100644 --- a/src/main/java/club/bytecode/the/jda/decompilers/bytecode/BytecodeDecompiler.java +++ b/src/main/java/club/bytecode/the/jda/decompilers/bytecode/BytecodeDecompiler.java @@ -4,6 +4,7 @@ import club.bytecode.the.jda.JDA; import club.bytecode.the.jda.api.JDANamespace; import club.bytecode.the.jda.decompilers.JDADecompiler; +import club.bytecode.the.jda.gui.fileviewer.BytecodeTokenizer; import club.bytecode.the.jda.settings.JDADecompilerSettings.SettingsEntry; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; @@ -160,4 +161,9 @@ public static String getAccessString(int access) { } return sb.toString(); } + + @Override + public String getTarget() { + return BytecodeTokenizer.SYNTAX_STYLE_BYTECODE; + } } diff --git a/src/main/java/club/bytecode/the/jda/gui/fileviewer/BytecodeSyntaxArea.java b/src/main/java/club/bytecode/the/jda/gui/fileviewer/BytecodeSyntaxArea.java index 5a94b13..39c7c6d 100644 --- a/src/main/java/club/bytecode/the/jda/gui/fileviewer/BytecodeSyntaxArea.java +++ b/src/main/java/club/bytecode/the/jda/gui/fileviewer/BytecodeSyntaxArea.java @@ -18,8 +18,7 @@ public class BytecodeSyntaxArea extends JDATextArea { public boolean foldsBuilt; public BytecodeSyntaxArea(String text) { - super(text); - setSyntaxEditingStyle(BytecodeTokenizer.SYNTAX_STYLE_BYTECODE); + super(text, BytecodeTokenizer.SYNTAX_STYLE_BYTECODE); setLinkScanningMask(0); setLinkGenerator(new BytecodeLinkGenerator()); diff --git a/src/main/java/club/bytecode/the/jda/gui/fileviewer/DecompileThread.java b/src/main/java/club/bytecode/the/jda/gui/fileviewer/DecompileThread.java index 8c134b6..d9ca5f7 100644 --- a/src/main/java/club/bytecode/the/jda/gui/fileviewer/DecompileThread.java +++ b/src/main/java/club/bytecode/the/jda/gui/fileviewer/DecompileThread.java @@ -48,10 +48,12 @@ public void run() { String text = stripUndisplayableChars(decompileResult); RSyntaxTextArea panelArea; - if (decompiler instanceof BytecodeDecompiler) { + if (decompiler.getTarget().equals(BytecodeTokenizer.SYNTAX_STYLE_BYTECODE)) { panelArea = new BytecodeSyntaxArea(text); - } else { + } else if (decompiler.getTarget().equals(JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA)) { panelArea = new JDATextArea(text); + } else { + panelArea = new JDATextArea(text, decompiler.getTarget()); } final RTextScrollPane scrollPane = new RTextScrollPane(panelArea); diff --git a/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java b/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java index 49535eb..cf64589 100644 --- a/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java +++ b/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java @@ -1,8 +1,28 @@ package club.bytecode.the.jda.gui.fileviewer; +import club.bytecode.the.jda.FileContainer; import club.bytecode.the.jda.JDA; import club.bytecode.the.jda.gui.search.SearchDialog; import club.bytecode.the.jda.settings.Settings; +import com.github.javaparser.*; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.ImportDeclaration; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.FieldDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt; +import com.github.javaparser.ast.type.ClassOrInterfaceType; +import com.github.javaparser.ast.visitor.VoidVisitor; +import com.github.javaparser.symbolsolver.JavaSymbolSolver; +import com.github.javaparser.symbolsolver.javaparser.Navigator; +import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; +import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory; +import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; +import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver; +import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; +import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.TokenTypes; @@ -13,19 +33,26 @@ import javax.swing.text.BadLocationException; import java.awt.*; import java.awt.event.*; +import java.io.*; import java.util.*; import java.util.List; public class JDATextArea extends RSyntaxTextArea { private List lines; private Map comments; + private CompilationUnit ast = null; private TokenWrapper currentlySelectedToken; public JDATextArea(String text) { + this(text, JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA); + ast = JavaParser.parse(text); + } + + public JDATextArea(String text, String language) { comments = new HashMap<>(); - setSyntaxEditingStyle(JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA); + setSyntaxEditingStyle(language); setCodeFoldingEnabled(true); setAntiAliasingEnabled(true); @@ -147,19 +174,104 @@ private boolean isStringSelected() { return currentlySelectedToken != null && currentlySelectedToken.getType() == TokenTypes.LITERAL_STRING_DOUBLE_QUOTE; } + interface NodeHandler { + boolean handle(Node node); + } private void doXrefDialog() { + class NodeIterator { + + + private NodeHandler nodeHandler; + + public NodeIterator(NodeHandler nodeHandler) { + this.nodeHandler = nodeHandler; + } + + public void explore(Node node) { + if( nodeHandler.handle(node)){ + for (Node child : node.getChildNodes()) { + explore(child); + }} + } + } + + if (ast != null) { + int startOff = Math.min(getCaret().getDot(), getCaret().getMark()); + int endOff = Math.max(getCaret().getDot(), getCaret().getMark()); + int caretLine = getCaretLineNumber()+1; + Position caretPos = new Position(getCaretLineNumber()+1, getCaretOffsetFromLineStart()); + CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); + JavaParser.getStaticConfiguration().setSymbolResolver(new JavaSymbolSolver(combinedTypeSolver)); + // combinedTypeSolver.add(new JavaParserTypeSolver(getText())); + for(FileContainer fc : JDA.getOpenFiles()) { + + try { + combinedTypeSolver.add(new JarTypeSolver(fc.file)); + } catch (IOException e) { + e.printStackTrace(); + } + } + combinedTypeSolver.add(new ReflectionTypeSolver()); + try { + combinedTypeSolver.add(new JarTypeSolver(new File("C:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\rt.jar"))); + } catch (IOException e) { + e.printStackTrace(); + } + JavaParserFacade solver = JavaParserFacade.get(combinedTypeSolver); + new NodeIterator(node -> { + Range r = node.getRange().orElse(null); + if (r == null) return false; + if (r.begin.compareTo(caretPos) <= 0 && r.end.compareTo(caretPos) >= 0) { + // if (r.begin.line == caretLine && r.end.line == caretLine) { + if (node instanceof MethodCallExpr) { + System.out.println(solver.solve((MethodCallExpr) node)); + } else if (node instanceof ClassOrInterfaceType) { + System.out.println(JavaParserFactory.getContext(node, solver.getTypeSolver()).solveType(((ClassOrInterfaceType) node).getName().getId(), solver.getTypeSolver())); + } else if (node instanceof NameExpr) { + System.out.println(JavaParserFactory.getContext(node, solver.getTypeSolver()).solveType(((NameExpr) node).getName().getId(), solver.getTypeSolver())); + } else if (node instanceof SimpleName) { + System.out.println(JavaParserFactory.getContext(node, solver.getTypeSolver()).solveType(((SimpleName) node).getId(), solver.getTypeSolver())); + } else if (node instanceof FieldAccessExpr) { + System.out.println(solver.solve((FieldAccessExpr) node)); + } else if (node instanceof ExplicitConstructorInvocationStmt) { + System.out.println(solver.solve((ExplicitConstructorInvocationStmt) node)); + } else if (node instanceof MethodDeclaration) { + System.out.println(solver.getTypeOfThisIn(node)); + } else if (node instanceof FieldDeclaration) { + System.out.println(solver.getTypeOfThisIn(node)); + } else if (node instanceof ClassOrInterfaceDeclaration) { + System.out.println(solver.getTypeOfThisIn(node)); + } else if (node instanceof ImportDeclaration) { + System.out.println(((ImportDeclaration) node).getName()); + } + // } + // System.out.println(node); + // System.out.println(); + // } + return true; + } + return false; + }).explore(ast); + // for (JavaToken tok = tr.getBegin(); tok != null; tok = tok.getNextToken().orElse(null)) { + // Range r = tok.getRange().orElse(null); + return; + } + String tokenName; - if (getSelectedText() != null) + if (getSelectedText() != null) { tokenName = getSelectedText(); - else if (isIdentifierSelected()) + } else if (isIdentifierSelected()) { tokenName = currentlySelectedToken.getLexeme(); - else if (isStringSelected()) { + } else if (isStringSelected()) { tokenName = currentlySelectedToken.getLexeme(); tokenName = tokenName.substring(1, tokenName.length() - 1); - } else + new SearchDialog(tokenName, JDA.constantSearchCallback.apply(tokenName)).setVisible(true); return; + } else { + return; + } - new SearchDialog(tokenName, JDA.searchCallback.apply(tokenName)).setVisible(true); + new SearchDialog(tokenName, JDA.constantSearchCallback.apply(tokenName)).setVisible(true); } private void doRenameDialog() { From 547defbe9be35ce9c859f80d276837960e235c7e Mon Sep 17 00:00:00 2001 From: rcx Date: Sun, 20 Jan 2019 23:25:03 -0500 Subject: [PATCH 2/2] Save --- libs/fernflower | 2 +- .../jda/decompilers/FernflowerDecompiler.java | 47 ++++++++-- .../the/jda/gui/fileviewer/JDATextArea.java | 93 +++---------------- 3 files changed, 53 insertions(+), 89 deletions(-) diff --git a/libs/fernflower b/libs/fernflower index 21a8095..dba97ca 160000 --- a/libs/fernflower +++ b/libs/fernflower @@ -1 +1 @@ -Subproject commit 21a80957bb2f6d470c38c3599674f06f2e905721 +Subproject commit dba97ca63108d5d31b9759423f3abfa6373f1f7a diff --git a/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java b/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java index 21e0df9..6fb76f4 100644 --- a/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java +++ b/src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java @@ -6,9 +6,15 @@ import club.bytecode.the.jda.gui.fileviewer.JDAJavaTokenizer; import club.bytecode.the.jda.settings.JDADecompilerSettings.SettingsEntry; import club.bytecode.the.jda.settings.Setting; +import org.jetbrains.java.decompiler.main.Fernflower; import org.jetbrains.java.decompiler.main.decompiler.BaseDecompiler; import org.jetbrains.java.decompiler.main.decompiler.PrintStreamLogger; import org.jetbrains.java.decompiler.main.extern.IResultSaver; +import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent; +import org.jetbrains.java.decompiler.struct.StructClass; +import org.jetbrains.java.decompiler.struct.StructContext; +import org.jetbrains.java.decompiler.util.TextBuffer; +import org.jetbrains.java.decompiler.util.TextRange; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.InnerClassNode; @@ -68,7 +74,7 @@ public String decompileClassNode(FileContainer container, final ClassNode cn) { final AtomicReference result = new AtomicReference<>(); result.set(null); - BaseDecompiler baseDecompiler = new BaseDecompiler((externalPath, internalPath) -> { + Fernflower fernflower = new Fernflower((externalPath, internalPath) -> { String className = JDA.extractProxyClassName(externalPath); ClassNode requestedCn; if (classCache.containsKey(className)) { @@ -132,7 +138,7 @@ public void closeArchive(String s, String s1) { while (!fifo.isEmpty()) { ClassNode curCn = fifo.pop(); visited.add(curCn.name); - baseDecompiler.addSpace(JDA.getClassFileProxy(curCn), true); + fernflower.addSource(JDA.getClassFileProxy(curCn)); for (InnerClassNode innerClass : curCn.innerClasses) { if (visited.contains(innerClass.name)) continue; @@ -152,13 +158,37 @@ public void closeArchive(String s, String s1) { } } - baseDecompiler.decompileContext(); - String decompileResult = result.get(); - if (decompileResult == null) { - return "// Fernflower returned null; perhaps this class is an inner class? Fernflower didn't play nice."; - } else { - return decompileResult; + fernflower.decompileContext(); + // String decompileResult = result.get(); + // if (decompileResult == null) { + // return "// Fernflower returned null; perhaps this class is an inner class? Fernflower didn't play nice."; + // } else { + // return decompileResult; + // } + String resultTxt = ""; + for (StructClass cl : fernflower.getStructContext().getClasses().values()) { + if (cl.isOwn()) { + if (cl.qualifiedName.equals(cn.name)) { + TextBuffer buf = fernflower.getClassContentBuffer(cl); + dank = new HashMap<>(); + for (Map.Entry wtf : buf.getTokenMapping().entrySet()) { + if (wtf.getValue() != null) { + try { + dank.put(wtf.getKey(), wtf.getValue().toString()); + }catch(Exception e){ + e.printStackTrace(); + } + } + } + if (buf != null) { + resultTxt += buf.toString() + "\n"; + } else { + resultTxt += "// fake news\n"; + } + } + } } + return resultTxt; } catch (Exception e) { return parseException(e); } @@ -179,5 +209,6 @@ private Map generateFernflowerArgs() { public String getTarget() { return JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA; } + public static Map dank; } diff --git a/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java b/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java index cf64589..185b506 100644 --- a/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java +++ b/src/main/java/club/bytecode/the/jda/gui/fileviewer/JDATextArea.java @@ -2,6 +2,7 @@ import club.bytecode.the.jda.FileContainer; import club.bytecode.the.jda.JDA; +import club.bytecode.the.jda.decompilers.FernflowerDecompiler; import club.bytecode.the.jda.gui.search.SearchDialog; import club.bytecode.the.jda.settings.Settings; import com.github.javaparser.*; @@ -26,6 +27,8 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.TokenTypes; +import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent; +import org.jetbrains.java.decompiler.util.TextRange; import javax.swing.*; import javax.swing.event.CaretEvent; @@ -46,7 +49,11 @@ public class JDATextArea extends RSyntaxTextArea { public JDATextArea(String text) { this(text, JDAJavaTokenizer.SYNTAX_STYLE_JDA_JAVA); - ast = JavaParser.parse(text); + try { + ast = JavaParser.parse(text); + } catch(ParseProblemException e) { + ast = null; + } } public JDATextArea(String text, String language) { @@ -86,6 +93,11 @@ public void caretUpdate(CaretEvent e) { break; } } + for (Map.Entry wtf : FernflowerDecompiler.dank.entrySet()) { + if (wtf.getKey().contains(cursorPos)) { + System.out.println(wtf.getValue()); + } + } } catch (BadLocationException e1) { e1.printStackTrace(); } @@ -178,85 +190,6 @@ interface NodeHandler { boolean handle(Node node); } private void doXrefDialog() { - class NodeIterator { - - - private NodeHandler nodeHandler; - - public NodeIterator(NodeHandler nodeHandler) { - this.nodeHandler = nodeHandler; - } - - public void explore(Node node) { - if( nodeHandler.handle(node)){ - for (Node child : node.getChildNodes()) { - explore(child); - }} - } - } - - if (ast != null) { - int startOff = Math.min(getCaret().getDot(), getCaret().getMark()); - int endOff = Math.max(getCaret().getDot(), getCaret().getMark()); - int caretLine = getCaretLineNumber()+1; - Position caretPos = new Position(getCaretLineNumber()+1, getCaretOffsetFromLineStart()); - CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); - JavaParser.getStaticConfiguration().setSymbolResolver(new JavaSymbolSolver(combinedTypeSolver)); - // combinedTypeSolver.add(new JavaParserTypeSolver(getText())); - for(FileContainer fc : JDA.getOpenFiles()) { - - try { - combinedTypeSolver.add(new JarTypeSolver(fc.file)); - } catch (IOException e) { - e.printStackTrace(); - } - } - combinedTypeSolver.add(new ReflectionTypeSolver()); - try { - combinedTypeSolver.add(new JarTypeSolver(new File("C:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\rt.jar"))); - } catch (IOException e) { - e.printStackTrace(); - } - JavaParserFacade solver = JavaParserFacade.get(combinedTypeSolver); - new NodeIterator(node -> { - Range r = node.getRange().orElse(null); - if (r == null) return false; - if (r.begin.compareTo(caretPos) <= 0 && r.end.compareTo(caretPos) >= 0) { - // if (r.begin.line == caretLine && r.end.line == caretLine) { - if (node instanceof MethodCallExpr) { - System.out.println(solver.solve((MethodCallExpr) node)); - } else if (node instanceof ClassOrInterfaceType) { - System.out.println(JavaParserFactory.getContext(node, solver.getTypeSolver()).solveType(((ClassOrInterfaceType) node).getName().getId(), solver.getTypeSolver())); - } else if (node instanceof NameExpr) { - System.out.println(JavaParserFactory.getContext(node, solver.getTypeSolver()).solveType(((NameExpr) node).getName().getId(), solver.getTypeSolver())); - } else if (node instanceof SimpleName) { - System.out.println(JavaParserFactory.getContext(node, solver.getTypeSolver()).solveType(((SimpleName) node).getId(), solver.getTypeSolver())); - } else if (node instanceof FieldAccessExpr) { - System.out.println(solver.solve((FieldAccessExpr) node)); - } else if (node instanceof ExplicitConstructorInvocationStmt) { - System.out.println(solver.solve((ExplicitConstructorInvocationStmt) node)); - } else if (node instanceof MethodDeclaration) { - System.out.println(solver.getTypeOfThisIn(node)); - } else if (node instanceof FieldDeclaration) { - System.out.println(solver.getTypeOfThisIn(node)); - } else if (node instanceof ClassOrInterfaceDeclaration) { - System.out.println(solver.getTypeOfThisIn(node)); - } else if (node instanceof ImportDeclaration) { - System.out.println(((ImportDeclaration) node).getName()); - } - // } - // System.out.println(node); - // System.out.println(); - // } - return true; - } - return false; - }).explore(ast); - // for (JavaToken tok = tr.getBegin(); tok != null; tok = tok.getNextToken().orElse(null)) { - // Range r = tok.getRange().orElse(null); - return; - } - String tokenName; if (getSelectedText() != null) { tokenName = getSelectedText();