summaryrefslogtreecommitdiffstats
path: root/src/org/jetbrains/java/decompiler/main/ClassWriter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/jetbrains/java/decompiler/main/ClassWriter.java')
-rw-r--r--src/org/jetbrains/java/decompiler/main/ClassWriter.java30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java
index 9c9c9c7..830e668 100644
--- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java
+++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java
@@ -164,7 +164,8 @@ public class ClassWriter {
ClassNode outerNode = (ClassNode)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_NODE);
DecompilerContext.setProperty(DecompilerContext.CURRENT_CLASS_NODE, node);
- BytecodeMappingTracer tracer = new BytecodeMappingTracer();
+ int total_offset_lines = 0;
+ BytecodeMappingTracer dummy_tracer = new BytecodeMappingTracer();
try {
// last minute processing
@@ -177,8 +178,13 @@ public class ClassWriter {
String lineSeparator = DecompilerContext.getNewLineSeparator();
+ // write class definition
+ int start_class_def = buffer.length();
writeClassDefinition(node, buffer, indent);
+ // count lines in class definition the easiest way
+ total_offset_lines = buffer.substring(start_class_def).toString().split(lineSeparator, -1).length - 1;
+
boolean hasContent = false;
// fields
@@ -204,7 +210,7 @@ public class ClassWriter {
enumFields = false;
}
- fieldToJava(wrapper, cl, fd, buffer, indent + 1, tracer);
+ fieldToJava(wrapper, cl, fd, buffer, indent + 1, dummy_tracer); // FIXME: insert real tracer
hasContent = true;
}
@@ -225,9 +231,13 @@ public class ClassWriter {
if (hasContent) {
buffer.append(lineSeparator);
}
- boolean methodSkipped = !methodToJava(node, mt, buffer, indent + 1, tracer);
+ BytecodeMappingTracer method_tracer = new BytecodeMappingTracer(total_offset_lines);
+ boolean methodSkipped = !methodToJava(node, mt, buffer, indent + 1, method_tracer);
if (!methodSkipped) {
hasContent = true;
+ DecompilerContext.getBytecodeSourceMapper().addTracer(cl.qualifiedName,
+ InterpreterUtil.makeUniqueKey(mt.getName(), mt.getDescriptor()), method_tracer);
+ total_offset_lines = method_tracer.getCurrentSourceline();
}
else {
buffer.setLength(position);
@@ -558,6 +568,10 @@ public class ClassWriter {
MethodWrapper methodWrapper = wrapper.getMethodWrapper(mt.getName(), mt.getDescriptor());
boolean hideMethod = false;
+ int start_index_method = buffer.length();
+
+ String indentString = InterpreterUtil.getIndentString(indent);
+ String lineSeparator = DecompilerContext.getNewLineSeparator();
MethodWrapper outerWrapper = (MethodWrapper)DecompilerContext.getProperty(DecompilerContext.CURRENT_METHOD_WRAPPER);
DecompilerContext.setProperty(DecompilerContext.CURRENT_METHOD_WRAPPER, methodWrapper);
@@ -569,9 +583,6 @@ public class ClassWriter {
boolean isDeprecated = mt.getAttributes().containsKey("Deprecated");
boolean clinit = false, init = false, dinit = false;
- String indentString = InterpreterUtil.getIndentString(indent);
- String lineSeparator = DecompilerContext.getNewLineSeparator();
-
MethodDescriptor md = MethodDescriptor.parseDescriptor(mt.getDescriptor());
int flags = mt.getAccessFlags();
@@ -793,6 +804,9 @@ public class ClassWriter {
if (root != null && !methodWrapper.decompiledWithErrors) { // check for existence
try {
+
+ tracer.setCurrentSourceline(buffer.substring(start_index_method).split(lineSeparator, -1).length - 1);
+
String code = root.toJava(indent + 1, tracer);
hideMethod = (clinit || dinit || hideConstructor(wrapper, init, throwsExceptions, paramCount)) && code.length() == 0;
@@ -820,6 +834,10 @@ public class ClassWriter {
DecompilerContext.setProperty(DecompilerContext.CURRENT_METHOD_WRAPPER, outerWrapper);
}
+ // save total lines
+ // TODO: optimize
+ tracer.setCurrentSourceline(buffer.substring(start_index_method).split(lineSeparator, -1).length - 1);
+
return !hideMethod;
}