From b61401f61ddb9dbc63a756da26ca65b6e5e692fd Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Mon, 14 Feb 2022 22:29:31 +0100 Subject: [PATCH 01/58] Create fork-sync.yml --- .github/workflows/fork-sync.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/fork-sync.yml diff --git a/.github/workflows/fork-sync.yml b/.github/workflows/fork-sync.yml new file mode 100644 index 00000000..ed8d4c86 --- /dev/null +++ b/.github/workflows/fork-sync.yml @@ -0,0 +1,18 @@ +name: Sync Fork + +on: + schedule: + - cron: '*/30 * * * *' # every 30 minutes + workflow_dispatch: # on button click + +jobs: + sync: + + runs-on: ubuntu-latest + + steps: + - uses: tgymnich/fork-sync@v1.4 + with: + owner: mstrobel + base: develop + head: develop From d52e076cb1fef1bd64c05caf76faecf97d9330b9 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 15 Feb 2022 07:09:16 +0100 Subject: [PATCH 02/58] Update fork-sync.yml --- .github/workflows/fork-sync.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/fork-sync.yml b/.github/workflows/fork-sync.yml index ed8d4c86..c3efb312 100644 --- a/.github/workflows/fork-sync.yml +++ b/.github/workflows/fork-sync.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: tgymnich/fork-sync@v1.4 + - uses: tgymnich/fork-sync@v1.6.3 with: owner: mstrobel base: develop From e8a4d90dbf8d87cccf0af6fb6587f628a66209f4 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 19 Mar 2022 11:56:02 +0100 Subject: [PATCH 03/58] try/catch formatting --- .../decompiler/languages/java/JavaOutputVisitor.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java index 90cb2546..a36a2af2 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java @@ -958,10 +958,19 @@ else if (parent instanceof WhileStatement) { closeBrace(style); } - if (!(parent instanceof Expression || parent instanceof DoWhileStatement)) { + if (!(parent instanceof Expression || parent instanceof DoWhileStatement || parent instanceof TryCatchStatement || parent instanceof CatchClause)) { newLine(); } + if (parent instanceof TryCatchStatement || parent instanceof CatchClause) { + if (node.getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE) { + newLine(); + } else { + space(); + } + } + + endNode(node); return null; From 8c28d0a2e8d06a539b615cf7e5d71d7fb33dffd5 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 19 Mar 2022 12:01:51 +0100 Subject: [PATCH 04/58] remove temp file for line number output and produce String output --- .../strobel/decompiler/DecompilerDriver.java | 53 +++---- .../decompiler/LineNumberFormatter.java | 143 +++++++++--------- .../decompiler/NoRetryMetadataSystem.java | 34 +++++ 3 files changed, 124 insertions(+), 106 deletions(-) create mode 100644 Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java index 67800d13..12c7d0aa 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java @@ -4,12 +4,20 @@ import com.strobel.Procyon; import com.strobel.annotations.NotNull; import com.strobel.assembler.InputTypeLoader; -import com.strobel.assembler.metadata.*; +import com.strobel.assembler.metadata.CompositeTypeLoader; +import com.strobel.assembler.metadata.DeobfuscationUtilities; +import com.strobel.assembler.metadata.IMetadataResolver; +import com.strobel.assembler.metadata.ITypeLoader; +import com.strobel.assembler.metadata.JarTypeLoader; +import com.strobel.assembler.metadata.MetadataParser; +import com.strobel.assembler.metadata.MetadataSystem; +import com.strobel.assembler.metadata.TypeDefinition; +import com.strobel.assembler.metadata.TypeReference; import com.strobel.core.ExceptionUtilities; import com.strobel.core.StringUtilities; import com.strobel.decompiler.LineNumberFormatter.LineNumberOption; -import com.strobel.decompiler.languages.BytecodeOutputOptions; import com.strobel.decompiler.languages.BytecodeLanguage; +import com.strobel.decompiler.languages.BytecodeOutputOptions; import com.strobel.decompiler.languages.Languages; import com.strobel.decompiler.languages.LineNumberPosition; import com.strobel.decompiler.languages.TypeDecompilationResults; @@ -24,14 +32,13 @@ import java.io.Writer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.EnumSet; import java.util.Enumeration; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.ConsoleHandler; @@ -295,7 +302,7 @@ private static void decompileType( final TypeDefinition resolvedType; if (type == null || (resolvedType = type.resolve()) == null) { - System.err.printf("!!! ERROR: Failed to load class %s.\n", typeName); + System.err.printf("!!! ERROR: Failed to load class %s.%n", typeName); return; } @@ -327,7 +334,7 @@ private static void decompileType( } if (writeToFile) { - System.out.printf("Decompiling %s...\n", typeName); + System.out.printf("Decompiling %s...%n", typeName); } final TypeDecompilationResults results = settings.getLanguage().decompileType(resolvedType, output, options); @@ -353,13 +360,17 @@ private static void decompileType( lineNumberOptions.add(LineNumberOption.STRETCHED); } + final File outputFile = ((FileOutputWriter) writer).getFile(); final LineNumberFormatter lineFormatter = new LineNumberFormatter( - ((FileOutputWriter) writer).getFile(), + outputFile, lineNumberPositions, lineNumberOptions ); - lineFormatter.reformatFile(); + final String reformattedFile = lineFormatter.reformatFile(); + final Charset charset = settings.isUnicodeOutputEnabled() ? StandardCharsets.UTF_8 + : Charset.defaultCharset(); + Files.write(outputFile.toPath(), reformattedFile.getBytes(charset)); } } @@ -454,30 +465,4 @@ public String format(@NotNull final LogRecord record) { " [" + record.getLevel() + "] " + loggerName + ": " + record.getMessage() + ' ' + lineSep; } -} - -final class NoRetryMetadataSystem extends MetadataSystem { - private final Set _failedTypes = new HashSet<>(); - - NoRetryMetadataSystem() { - } - - NoRetryMetadataSystem(final ITypeLoader typeLoader) { - super(typeLoader); - } - - @Override - protected TypeDefinition resolveType(final String descriptor, final boolean mightBePrimitive) { - if (_failedTypes.contains(descriptor)) { - return null; - } - - final TypeDefinition result = super.resolveType(descriptor, mightBePrimitive); - - if (result == null) { - _failedTypes.add(descriptor); - } - - return result; - } } \ No newline at end of file diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java index a05e386d..5e12ba05 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java @@ -1,11 +1,11 @@ package com.strobel.decompiler; import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; import java.util.EnumSet; @@ -19,7 +19,7 @@ * line number information. It can handle either, or both, of the following jobs: * *
    - *
  • Introduce line numbers as leading comments. + *
  • Introduce line numbers as leading comments. *
  • Stretch the file so that the line number comments match the physical lines. *
*/ @@ -27,17 +27,17 @@ public class LineNumberFormatter { private final List _positions; private final File _file; private final EnumSet _options; - + public enum LineNumberOption { LEADING_COMMENTS, STRETCHED, } - + /** * Constructs an instance. * - * @param file the file whose line numbers should be fixed + * @param file the file whose line numbers should be fixed * @param lineNumberPositions a recipe for how to fix the line numbers in 'file'. * @param options controls how 'this' represents line numbers in the resulting file */ @@ -46,115 +46,118 @@ public LineNumberFormatter(File file, EnumSet options) { _file = file; _positions = lineNumberPositions; - _options = (options == null ? EnumSet.noneOf( LineNumberOption.class) : options); + _options = (options == null ? EnumSet.noneOf(LineNumberOption.class) : options); } /** - * Rewrites the file passed to 'this' constructor so that the actual line numbers match - * the recipe passed to 'this' constructor. + * Rewrites the file passed to 'this' constructor so that the actual line + * numbers match the recipe passed to 'this' constructor. + * + * @return The formatted source code */ - public void reformatFile() throws IOException { - List lineBrokenPositions = new ArrayList(); - List brokenLines = breakLines( lineBrokenPositions); - emitFormatted( brokenLines, lineBrokenPositions); + public String reformatFile() throws IOException { + List lineBrokenPositions = new ArrayList<>(); + List brokenLines = breakLines(lineBrokenPositions); + try (StringWriter sw = new StringWriter()) { + emitFormatted(brokenLines, lineBrokenPositions, sw); + return sw.toString(); + } } - + /** * Processes {@link #_file}, breaking apart any lines on which multiple line-number markers * appear in different columns. * * @return the list of broken lines */ - private List breakLines( List o_LineBrokenPositions) throws IOException { + private List breakLines(List o_LineBrokenPositions) throws IOException { int numLinesRead = 0; int lineOffset = 0; List brokenLines = new ArrayList<>(); - try( BufferedReader r = new BufferedReader( new FileReader( _file))) { - for ( int posIndex=0; posIndex<_positions.size(); posIndex++) { - LineNumberPosition pos = _positions.get( posIndex); + try (BufferedReader r = new BufferedReader(new FileReader(_file))) { + for (int posIndex = 0; posIndex < _positions.size(); posIndex++) { + LineNumberPosition pos = _positions.get(posIndex); o_LineBrokenPositions.add( new LineNumberPosition( pos.getOriginalLine(), pos.getEmittedLine()+lineOffset, pos.getEmittedColumn())); - + // Copy the input file up to but not including the emitted line # in "pos". - while ( numLinesRead < pos.getEmittedLine()-1) { - brokenLines.add( r.readLine()); + while (numLinesRead < pos.getEmittedLine() - 1) { + brokenLines.add(r.readLine()); numLinesRead++; } - + // Read the line that contains the next line number annotations, but don't write it yet. String line = r.readLine(); numLinesRead++; - + // See if there are two original line annotations on the same emitted line. LineNumberPosition nextPos; int prevPartLen = 0; char[] indent = {}; do { - nextPos = (posIndex < _positions.size()-1) ? _positions.get( posIndex+1) : null; + nextPos = (posIndex < _positions.size() - 1) ? _positions.get(posIndex + 1) : null; if ( nextPos != null && nextPos.getEmittedLine() == pos.getEmittedLine() - && nextPos.getOriginalLine() > pos.getOriginalLine()) { + && nextPos.getOriginalLine() > pos.getOriginalLine()) { // Two different source line numbers on the same emitted line! posIndex++; lineOffset++; - String firstPart = line.substring( 0, nextPos.getEmittedColumn() - prevPartLen - 1); - brokenLines.add( new String(indent) + firstPart); + String firstPart = line.substring(0, nextPos.getEmittedColumn() - prevPartLen - 1); + brokenLines.add(new String(indent) + firstPart); prevPartLen += firstPart.length(); indent = new char[prevPartLen]; - Arrays.fill( indent, ' '); - line = line.substring( firstPart.length(), line.length()); - + Arrays.fill(indent, ' '); + line = line.substring(firstPart.length(), line.length()); + // Alter the position while adding it. o_LineBrokenPositions.add( new LineNumberPosition( nextPos.getOriginalLine(), nextPos.getEmittedLine()+lineOffset, nextPos.getEmittedColumn())); } else { nextPos = null; } - } while ( nextPos != null); - + } while (nextPos != null); + // Nothing special here-- just emit the line. - brokenLines.add( new String(indent) + line); + brokenLines.add(new String(indent) + line); } - + // Copy out the remainder of the file. String line; - while ( (line = r.readLine()) != null) { - brokenLines.add( line); + while ((line = r.readLine()) != null) { + brokenLines.add(line); } } return brokenLines; } - - private void emitFormatted( List brokenLines, List lineBrokenPositions) throws IOException { - File tempFile = new File( _file.getAbsolutePath() + ".fixed"); + + private void emitFormatted(List brokenLines, List lineBrokenPositions, Writer writer) { int globalOffset = 0; int numLinesRead = 0; Iterator lines = brokenLines.iterator(); - - int maxLineNo = LineNumberPosition.computeMaxLineNumber( lineBrokenPositions); - try( LineNumberPrintWriter w = new LineNumberPrintWriter( - maxLineNo, new BufferedWriter( new FileWriter( tempFile)))) { - + + int maxLineNo = LineNumberPosition.computeMaxLineNumber(lineBrokenPositions); + try (LineNumberPrintWriter w = new LineNumberPrintWriter(maxLineNo, writer)) { + // Suppress all line numbers if we weren't asked to show them. - if ( ! _options.contains( LineNumberOption.LEADING_COMMENTS)) { + if (!_options.contains(LineNumberOption.LEADING_COMMENTS)) { w.suppressLineNumbers(); } - + // Suppress stretching if we weren't asked to do it. - boolean doStretching = (_options.contains( LineNumberOption.STRETCHED)); - - for ( LineNumberPosition pos : lineBrokenPositions) { + boolean doStretching = (_options.contains(LineNumberOption.STRETCHED)); + + for (LineNumberPosition pos : lineBrokenPositions) { int nextTarget = pos.getOriginalLine(); int nextActual = pos.getEmittedLine(); int requiredAdjustment = (nextTarget - nextActual - globalOffset); - + if (doStretching && requiredAdjustment < 0) { // We currently need to remove newlines to squeeze things together. - // prefer to remove empty lines, + // prefer to remove empty lines, // 1. read all lines before nextActual and remove empty lines as needed List stripped = new ArrayList<>(); - while( numLinesRead < nextActual - 1) { + while (numLinesRead < nextActual - 1) { String line = lines.next(); numLinesRead++; if ((requiredAdjustment < 0) && line.trim().isEmpty()) { @@ -169,59 +172,55 @@ maxLineNo, new BufferedWriter( new FileWriter( tempFile)))) { ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; for (String line : stripped) { if (requiredAdjustment < 0) { - w.print( lineNoToPrint, line); - w.print( " "); + w.print(lineNoToPrint, line); + w.print(" "); requiredAdjustment++; globalOffset--; } else { - w.println( lineNoToPrint, line); + w.println(lineNoToPrint, line); } } // 3. read and print next actual String line = lines.next(); numLinesRead++; if (requiredAdjustment < 0) { - w.print( nextTarget, line); - w.print( " "); + w.print(nextTarget, line); + w.print(" "); globalOffset--; } else { - w.println( nextTarget, line); + w.println(nextTarget, line); } } else { - while( numLinesRead < nextActual) { + while (numLinesRead < nextActual) { String line = lines.next(); numLinesRead++; boolean isLast = (numLinesRead >= nextActual); int lineNoToPrint = isLast ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; - - if ( requiredAdjustment > 0 && doStretching) { + + if (requiredAdjustment > 0 && doStretching) { // We currently need to inject newlines to space things out. do { - w.println( ""); + w.println(""); requiredAdjustment--; globalOffset++; - } while ( isLast && requiredAdjustment > 0); - w.println( lineNoToPrint, line); + } while (isLast && requiredAdjustment > 0); + w.println(lineNoToPrint, line); } else { // No tweaks needed-- we are on the ball. - w.println( lineNoToPrint, line); + w.println(lineNoToPrint, line); } } } } - + // Finish out the file. String line; - while ( lines.hasNext()) { + while (lines.hasNext()) { line = lines.next(); - w.println( line); + w.println(line); } } - - // Delete the original file and rename the formatted temp file over the original. - _file.delete(); - tempFile.renameTo( _file); } } diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java new file mode 100644 index 00000000..770d1bce --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java @@ -0,0 +1,34 @@ +package com.strobel.decompiler; + +import com.strobel.assembler.metadata.ITypeLoader; +import com.strobel.assembler.metadata.MetadataSystem; +import com.strobel.assembler.metadata.TypeDefinition; + +import java.util.HashSet; +import java.util.Set; + +public final class NoRetryMetadataSystem extends MetadataSystem { + private final Set _failedTypes = new HashSet<>(); + + NoRetryMetadataSystem() { + } + + NoRetryMetadataSystem(final ITypeLoader typeLoader) { + super(typeLoader); + } + + @Override + protected TypeDefinition resolveType(final String descriptor, final boolean mightBePrimitive) { + if (_failedTypes.contains(descriptor)) { + return null; + } + + final TypeDefinition result = super.resolveType(descriptor, mightBePrimitive); + + if (result == null) { + _failedTypes.add(descriptor); + } + + return result; + } +} \ No newline at end of file From 5961f420d02ac9ebde349d6f76f18b01e707284a Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 19 Mar 2022 22:39:22 +0100 Subject: [PATCH 05/58] try/catch/finally and if/else formatting policy --- .../languages/java/JavaOutputVisitor.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java index a36a2af2..df324d2c 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java @@ -19,7 +19,6 @@ import com.strobel.assembler.ir.attributes.AttributeNames; import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; import com.strobel.assembler.ir.attributes.ModuleAttribute; -import com.strobel.assembler.ir.attributes.PermittedSubclassesAttribute; import com.strobel.assembler.ir.attributes.SourceAttribute; import com.strobel.assembler.metadata.*; import com.strobel.core.ArrayUtilities; @@ -958,19 +957,30 @@ else if (parent instanceof WhileStatement) { closeBrace(style); } - if (!(parent instanceof Expression || parent instanceof DoWhileStatement || parent instanceof TryCatchStatement || parent instanceof CatchClause)) { - newLine(); - } - - if (parent instanceof TryCatchStatement || parent instanceof CatchClause) { - if (node.getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE) { - newLine(); + if (!(parent instanceof Expression || parent instanceof DoWhileStatement)) { + if (parent.getNextSibling() != null && parent.getNextSibling().getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE) { + if (policy.PlaceFinallyOnNewLine) { + newLine(); + } else { + space(); + } + } else if (parent.getNextSibling() instanceof CatchClause || (parent instanceof TryCatchStatement && node.getNextSibling() instanceof CatchClause)) { + if (policy.PlaceCatchOnNewLine) { + newLine(); + } else { + space(); + } + } else if (parent instanceof IfElseStatement && node.getRole() == IfElseStatement.TRUE_ROLE && node != parent.getLastChild()) { + if (policy.PlaceElseOnNewLine) { + newLine(); + } else { + space(); + } } else { - space(); + newLine(); } } - endNode(node); return null; @@ -2704,7 +2714,7 @@ public Void visitArrayCreationExpression(final ArrayCreationExpression node, fin boolean needType = true; - //noinspection RedundantIfStatement + // noinspection RedundantIfStatement if (node.getDimensions().isEmpty() && node.getType() != null && (node.getParent() instanceof ArrayInitializerExpression || From 8f1471afde13f1e410c916770f490a38ca60ec37 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Fri, 25 Mar 2022 17:21:05 +0100 Subject: [PATCH 06/58] format try/finally --- .../strobel/decompiler/languages/java/JavaOutputVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java index df324d2c..bc650909 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java @@ -958,7 +958,7 @@ else if (parent instanceof WhileStatement) { } if (!(parent instanceof Expression || parent instanceof DoWhileStatement)) { - if (parent.getNextSibling() != null && parent.getNextSibling().getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE) { + if ((parent.getNextSibling() != null && parent.getNextSibling().getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE) || (node.getRole() == TryCatchStatement.TRY_BLOCK_ROLE && node.getNextSibling().getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE)) { if (policy.PlaceFinallyOnNewLine) { newLine(); } else { @@ -970,7 +970,7 @@ else if (parent instanceof WhileStatement) { } else { space(); } - } else if (parent instanceof IfElseStatement && node.getRole() == IfElseStatement.TRUE_ROLE && node != parent.getLastChild()) { + } else if (parent instanceof IfElseStatement && node.getRole() == IfElseStatement.TRUE_ROLE && node != parent.getLastChild()) { if (policy.PlaceElseOnNewLine) { newLine(); } else { From 9537e0755ec06b8ba19a600a2cdba1cf996887a6 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 27 Mar 2022 23:06:40 +0200 Subject: [PATCH 07/58] invert if statements to place line numbers in the right order --- .../languages/java/LineNumberVisitor.java | 505 ++++++++++++++++++ .../InvertIfStatementsTransform.java | 75 +++ .../transforms/TransformationPipeline.java | 1 + 3 files changed, 581 insertions(+) create mode 100644 Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/LineNumberVisitor.java create mode 100644 Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/LineNumberVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/LineNumberVisitor.java new file mode 100644 index 00000000..d808c249 --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/LineNumberVisitor.java @@ -0,0 +1,505 @@ +package com.strobel.decompiler.languages.java; + +import com.strobel.decompiler.languages.java.ast.Annotation; +import com.strobel.decompiler.languages.java.ast.AnonymousObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayInitializerExpression; +import com.strobel.decompiler.languages.java.ast.ArraySpecifier; +import com.strobel.decompiler.languages.java.ast.AssertStatement; +import com.strobel.decompiler.languages.java.ast.AssignmentExpression; +import com.strobel.decompiler.languages.java.ast.AstNode; +import com.strobel.decompiler.languages.java.ast.BinaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.BreakStatement; +import com.strobel.decompiler.languages.java.ast.BytecodeConstant; +import com.strobel.decompiler.languages.java.ast.CaseLabel; +import com.strobel.decompiler.languages.java.ast.CastExpression; +import com.strobel.decompiler.languages.java.ast.CatchClause; +import com.strobel.decompiler.languages.java.ast.ClassOfExpression; +import com.strobel.decompiler.languages.java.ast.Comment; +import com.strobel.decompiler.languages.java.ast.CompilationUnit; +import com.strobel.decompiler.languages.java.ast.ComposedType; +import com.strobel.decompiler.languages.java.ast.ConditionalExpression; +import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; +import com.strobel.decompiler.languages.java.ast.ContinueStatement; +import com.strobel.decompiler.languages.java.ast.DoWhileStatement; +import com.strobel.decompiler.languages.java.ast.EmptyStatement; +import com.strobel.decompiler.languages.java.ast.EnumValueDeclaration; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.ExpressionStatement; +import com.strobel.decompiler.languages.java.ast.FieldDeclaration; +import com.strobel.decompiler.languages.java.ast.ForEachStatement; +import com.strobel.decompiler.languages.java.ast.ForStatement; +import com.strobel.decompiler.languages.java.ast.GotoStatement; +import com.strobel.decompiler.languages.java.ast.IAstVisitor; +import com.strobel.decompiler.languages.java.ast.Identifier; +import com.strobel.decompiler.languages.java.ast.IdentifierExpression; +import com.strobel.decompiler.languages.java.ast.IfElseStatement; +import com.strobel.decompiler.languages.java.ast.ImportDeclaration; +import com.strobel.decompiler.languages.java.ast.IndexerExpression; +import com.strobel.decompiler.languages.java.ast.InlinedBytecodeExpression; +import com.strobel.decompiler.languages.java.ast.InstanceInitializer; +import com.strobel.decompiler.languages.java.ast.InstanceOfExpression; +import com.strobel.decompiler.languages.java.ast.IntersectionType; +import com.strobel.decompiler.languages.java.ast.InvocationExpression; +import com.strobel.decompiler.languages.java.ast.JavaTokenNode; +import com.strobel.decompiler.languages.java.ast.LabelStatement; +import com.strobel.decompiler.languages.java.ast.LabeledStatement; +import com.strobel.decompiler.languages.java.ast.LambdaExpression; +import com.strobel.decompiler.languages.java.ast.LocalTypeDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; +import com.strobel.decompiler.languages.java.ast.MethodDeclaration; +import com.strobel.decompiler.languages.java.ast.MethodGroupExpression; +import com.strobel.decompiler.languages.java.ast.ModuleDeclaration; +import com.strobel.decompiler.languages.java.ast.NewLineNode; +import com.strobel.decompiler.languages.java.ast.NullReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.PackageDeclaration; +import com.strobel.decompiler.languages.java.ast.ParameterDeclaration; +import com.strobel.decompiler.languages.java.ast.ParenthesizedExpression; +import com.strobel.decompiler.languages.java.ast.PrimitiveExpression; +import com.strobel.decompiler.languages.java.ast.ReturnStatement; +import com.strobel.decompiler.languages.java.ast.SimpleType; +import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression; +import com.strobel.decompiler.languages.java.ast.SwitchExpression; +import com.strobel.decompiler.languages.java.ast.SwitchExpressionArm; +import com.strobel.decompiler.languages.java.ast.SwitchSection; +import com.strobel.decompiler.languages.java.ast.SwitchStatement; +import com.strobel.decompiler.languages.java.ast.SynchronizedStatement; +import com.strobel.decompiler.languages.java.ast.TextNode; +import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ThrowStatement; +import com.strobel.decompiler.languages.java.ast.TryCatchStatement; +import com.strobel.decompiler.languages.java.ast.TypeDeclaration; +import com.strobel.decompiler.languages.java.ast.TypeParameterDeclaration; +import com.strobel.decompiler.languages.java.ast.TypeReferenceExpression; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.UnionType; +import com.strobel.decompiler.languages.java.ast.VariableDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.VariableInitializer; +import com.strobel.decompiler.languages.java.ast.WhileStatement; +import com.strobel.decompiler.languages.java.ast.WildcardType; +import com.strobel.decompiler.patterns.Pattern; + +public class LineNumberVisitor implements IAstVisitor { + + private final LineNumberTableConverter lineNumberTableConverter; + private int minLineNumber = Integer.MAX_VALUE; + private int maxLineNumber = Integer.MIN_VALUE; + + public LineNumberVisitor(final LineNumberTableConverter lineNumberTableConverter) { + this.lineNumberTableConverter = lineNumberTableConverter; + } + + private Void updateMinMaxLineNumbers(int offset, AstNode node) { + if (offset != Expression.MYSTERY_OFFSET) { + int lineNumber = lineNumberTableConverter.getLineForOffset(offset); + minLineNumber = Math.min(minLineNumber, lineNumber); + maxLineNumber = Math.max(maxLineNumber, lineNumber); + } + visitChildren(node); + return null; + } + + private void visitChildren(AstNode node) { + if (node.hasChildren()) { + for (AstNode child : node.getChildren()) { + child.acceptVisitor(this, null); + } + } + } + + @Override + public Void visitComment(Comment node, Void data) { + return null; + } + + @Override + public Void visitPatternPlaceholder(AstNode node, Pattern pattern, Void data) { + return null; + } + + @Override + public Void visitInvocationExpression(InvocationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitTypeReference(TypeReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitJavaTokenNode(JavaTokenNode node, Void data) { + return null; + } + + @Override + public Void visitMemberReferenceExpression(MemberReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIdentifier(Identifier node, Void data) { + return null; + } + + @Override + public Void visitNullReferenceExpression(NullReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSuperReferenceExpression(SuperReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitClassOfExpression(ClassOfExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBlockStatement(BlockStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitExpressionStatement(ExpressionStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBreakStatement(BreakStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitContinueStatement(ContinueStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitDoWhileStatement(DoWhileStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitEmptyStatement(EmptyStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIfElseStatement(IfElseStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLabelStatement(LabelStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLabeledStatement(LabeledStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitReturnStatement(ReturnStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSwitchStatement(SwitchStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSwitchSection(SwitchSection node, Void data) { + return null; + } + + @Override + public Void visitSwitchExpression(SwitchExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSwitchExpressionArm(SwitchExpressionArm node, Void data) { + return null; + } + + @Override + public Void visitCaseLabel(CaseLabel node, Void data) { + return null; + } + + @Override + public Void visitThrowStatement(ThrowStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitCatchClause(CatchClause node, Void data) { + return null; + } + + @Override + public Void visitAnnotation(Annotation node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitNewLine(NewLineNode node, Void data) { + return null; + } + + @Override + public Void visitVariableDeclaration(VariableDeclarationStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitVariableInitializer(VariableInitializer node, Void data) { + visitChildren(node); + return null; + } + + @Override + public Void visitText(TextNode node, Void data) { + return null; + } + + @Override + public Void visitImportDeclaration(ImportDeclaration node, Void data) { + return null; + } + + @Override + public Void visitSimpleType(SimpleType node, Void data) { + return null; + } + + @Override + public Void visitMethodDeclaration(MethodDeclaration node, Void data) { + return null; + } + + @Override + public Void visitInitializerBlock(InstanceInitializer node, Void data) { + return null; + } + + @Override + public Void visitConstructorDeclaration(ConstructorDeclaration node, Void data) { + return null; + } + + @Override + public Void visitTypeParameterDeclaration(TypeParameterDeclaration node, Void data) { + return null; + } + + @Override + public Void visitParameterDeclaration(ParameterDeclaration node, Void data) { + return null; + } + + @Override + public Void visitFieldDeclaration(FieldDeclaration node, Void data) { + return null; + } + + @Override + public Void visitTypeDeclaration(TypeDeclaration node, Void data) { + return null; + } + + @Override + public Void visitModuleDeclaration(ModuleDeclaration node, Void data) { + return null; + } + + @Override + public Void visitCompilationUnit(CompilationUnit node, Void data) { + return null; + } + + @Override + public Void visitPackageDeclaration(PackageDeclaration node, Void data) { + return null; + } + + @Override + public Void visitArraySpecifier(ArraySpecifier node, Void data) { + return null; + } + + @Override + public Void visitComposedType(ComposedType node, Void data) { + return null; + } + + @Override + public Void visitIntersectionType(IntersectionType node, Void data) { + return null; + } + + @Override + public Void visitUnionType(UnionType node, Void data) { + return null; + } + + @Override + public Void visitWhileStatement(WhileStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitPrimitiveExpression(PrimitiveExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitCastExpression(CastExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBinaryOperatorExpression(BinaryOperatorExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitInstanceOfExpression(InstanceOfExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIndexerExpression(IndexerExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIdentifierExpression(IdentifierExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitUnaryOperatorExpression(UnaryOperatorExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitConditionalExpression(ConditionalExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitArrayInitializerExpression(ArrayInitializerExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitObjectCreationExpression(ObjectCreationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitArrayCreationExpression(ArrayCreationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitAssignmentExpression(AssignmentExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitForStatement(ForStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitForEachStatement(ForEachStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitTryCatchStatement(TryCatchStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitGotoStatement(GotoStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitParenthesizedExpression(ParenthesizedExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSynchronizedStatement(SynchronizedStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitAnonymousObjectCreationExpression(AnonymousObjectCreationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitWildcardType(WildcardType node, Void data) { + return null; + } + + @Override + public Void visitMethodGroupExpression(MethodGroupExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitEnumValueDeclaration(EnumValueDeclaration node, Void data) { + return null; + } + + @Override + public Void visitAssertStatement(AssertStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLambdaExpression(LambdaExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLocalTypeDeclarationStatement(LocalTypeDeclarationStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitInlinedBytecode(InlinedBytecodeExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBytecodeConstant(BytecodeConstant node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + public int getMinLineNumber() { + return minLineNumber; + } + + public int getMaxLineNumber() { + return maxLineNumber; + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java new file mode 100644 index 00000000..dac19f71 --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java @@ -0,0 +1,75 @@ +/* + * InvertIfStatementsTransform.java + * + * Copyright (c) 2013 Mike Strobel + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java.ast.transforms; + +import com.strobel.assembler.ir.attributes.AttributeNames; +import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; +import com.strobel.assembler.ir.attributes.SourceAttribute; +import com.strobel.decompiler.DecompilerContext; +import com.strobel.decompiler.languages.java.LineNumberTableConverter; +import com.strobel.decompiler.languages.java.LineNumberVisitor; +import com.strobel.decompiler.languages.java.ast.AstNode; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.IfElseStatement; +import com.strobel.decompiler.languages.java.ast.Statement; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorType; + +public class InvertIfStatementsTransform extends ContextTrackingVisitor { + public InvertIfStatementsTransform(final DecompilerContext context) { + super(context); + } + + @Override + public Void visitIfElseStatement(final IfElseStatement node, final Void data) { + super.visitIfElseStatement(node, data); + + final Statement trueStatement = node.getTrueStatement(); + final Statement falseStatement = node.getFalseStatement(); + + final LineNumberTableAttribute lineNumberTableAttribute = SourceAttribute.find(AttributeNames.LineNumberTable, context.getCurrentMethod().getSourceAttributes()); + if (lineNumberTableAttribute == null) { + return null; + } + final LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTableAttribute); + final LineNumberVisitor trueLineNumberVisitor = new LineNumberVisitor(lineNumberTableConverter); + final LineNumberVisitor nextLineNumbervisitor = new LineNumberVisitor(lineNumberTableConverter); + final AstNode nextSibling = node.getNextSibling(); + if ((falseStatement == null || falseStatement.isNull()) && nextSibling != null) { + trueStatement.acceptVisitor(trueLineNumberVisitor, null); + nextSibling.acceptVisitor(nextLineNumbervisitor, null); + if (nextLineNumbervisitor.getMaxLineNumber() != Integer.MIN_VALUE && trueLineNumberVisitor.getMinLineNumber() != Integer.MAX_VALUE + && nextLineNumbervisitor.getMaxLineNumber() < trueLineNumberVisitor.getMinLineNumber()) { + final Expression condition = node.getCondition(); + condition.remove(); + node.setCondition(new UnaryOperatorExpression(UnaryOperatorType.NOT, condition)); + trueStatement.remove(); + node.setFalseStatement(trueStatement); + BlockStatement blockStatement = new BlockStatement(); + for (Statement next = node.getNextStatement(); next != null; next = node.getNextStatement()) { + next.remove(); + blockStatement.add(next); + } + node.setTrueStatement(blockStatement); + } + } + + return null; + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java index 6a2ff63f..3b12b724 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java @@ -55,6 +55,7 @@ public static IAstTransform[] createPipeline(final DecompilerContext context) { new RewriteInnerClassConstructorCalls(context), new RemoveRedundantInitializersTransform(context), new FlattenElseIfStatementsTransform(context), + new InvertIfStatementsTransform(context), new RewriteSwitchExpressionsTransform(context), // invariant: any transforms requiring CFA/DAA must be done by now new AssertStatementTransform(context), // (again due to switch expression rewriting) new FlattenSwitchBlocksTransform(context), From 29963da83e4e5dab04e1f7f889abca44fbfa57ce Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Fri, 1 Apr 2022 17:51:00 +0200 Subject: [PATCH 08/58] version 1.0-SNAPSHOT --- Procyon.Core/src/main/java/com/strobel/Procyon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procyon.Core/src/main/java/com/strobel/Procyon.java b/Procyon.Core/src/main/java/com/strobel/Procyon.java index cec413c8..bf393e30 100644 --- a/Procyon.Core/src/main/java/com/strobel/Procyon.java +++ b/Procyon.Core/src/main/java/com/strobel/Procyon.java @@ -14,7 +14,7 @@ package com.strobel; public final class Procyon { - private static final String VERSION = "0.6.0"; + private static final String VERSION = "1.0-SNAPSHOT"; public static String version() { return VERSION; From 21f957cde9ee95ca300742ef55902255af9e2db5 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Fri, 1 Apr 2022 21:17:06 +0200 Subject: [PATCH 09/58] avoid double negation --- .../java/ast/transforms/InvertIfStatementsTransform.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java index dac19f71..86e4884e 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java @@ -58,7 +58,13 @@ public Void visitIfElseStatement(final IfElseStatement node, final Void data) { && nextLineNumbervisitor.getMaxLineNumber() < trueLineNumberVisitor.getMinLineNumber()) { final Expression condition = node.getCondition(); condition.remove(); - node.setCondition(new UnaryOperatorExpression(UnaryOperatorType.NOT, condition)); + if (condition instanceof UnaryOperatorExpression && ((UnaryOperatorExpression) condition).getOperator() == UnaryOperatorType.NOT) { + Expression expression = ((UnaryOperatorExpression) condition).getExpression(); + expression.remove(); + node.setCondition(expression); + } else { + node.setCondition(new UnaryOperatorExpression(UnaryOperatorType.NOT, condition)); + } trueStatement.remove(); node.setFalseStatement(trueStatement); BlockStatement blockStatement = new BlockStatement(); From b6e1c75f0501b52733fba49dab4c426851d755f3 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 2 Apr 2022 09:29:18 +0200 Subject: [PATCH 10/58] added unit tests InvertIfTests --- .../com/strobel/decompiler/InvertIfTests.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java new file mode 100644 index 00000000..4c05bad6 --- /dev/null +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java @@ -0,0 +1,90 @@ +/* + * InvertIfTests.java + * + * Copyright (c) 2013 Mike Strobel + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +import org.junit.Test; + +public class InvertIfTests extends DecompilerTest { + private class T { + void main(final String[] args) { + if (args.length == 0) { + System.out.println("no arg"); + } else { + if (args.length == 1) { + System.out.println("1 arg"); + } else { + throw new RuntimeException("too many args"); + } + } + } + } + + private class U { + void test(final Object o) { + if (o instanceof String) { + System.out.println(o); + } else { + if (o instanceof CharSequence) { + System.out.println(o); + } else { + throw new RuntimeException(); + } + } + } + } + + @Test + public void testInvertIfTest() { + verifyOutput( + T.class, + defaultSettings(), + "private class T\n" + + "{\n" + + " void main(final String[] args) {\n" + + " if (args.length == 0) {\n" + + " System.out.println(\"no arg\");\n" + + " } else {\n" + + " if (args.length == 1) {\n" + + " System.out.println(\"1 arg\");\n" + + " } else {\n" + + " throw new RuntimeException(\"too many args\");\n" + + " }\n" + + " }\n" + + " }\n" + + "}" + ); + } + + @Test + public void testInvertIfDoubleNegationTest() { + verifyOutput( + U.class, + defaultSettings(), + "private class U\n" + + "{\n" + + " void test(final Object o) {\n" + + " if (o instanceof String) {\n" + + " System.out.println(o);\n" + + " } else {\n" + + " if (o instanceof CharSequence) {\n" + + " System.out.println(o);\n" + + " } else {\n" + + " throw new RuntimeException();\n" + + " }\n" + + " }\n" + + " }\n" + + "}" + ); + } +} \ No newline at end of file From deb9e39b713a57b8c0c44bbdc8ee8047b37d09ac Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 2 Apr 2022 09:44:57 +0200 Subject: [PATCH 11/58] InvertIfTests with line numbers --- .../com/strobel/decompiler/InvertIfTests.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java index 4c05bad6..7b313000 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java @@ -48,17 +48,17 @@ void test(final Object o) { public void testInvertIfTest() { verifyOutput( T.class, - defaultSettings(), + lineNumberSettings(), "private class T\n" + "{\n" + " void main(final String[] args) {\n" + - " if (args.length == 0) {\n" + - " System.out.println(\"no arg\");\n" + + " /*SL:21*/if (args.length == 0) {\n" + + " System.out.println(/*EL:22*/\"no arg\");\n" + " } else {\n" + - " if (args.length == 1) {\n" + - " System.out.println(\"1 arg\");\n" + + " /*SL:24*/if (args.length == 1) {\n" + + " System.out.println(/*EL:25*/\"1 arg\");\n" + " } else {\n" + - " throw new RuntimeException(\"too many args\");\n" + + " /*SL:27*/throw new RuntimeException(\"too many args\");\n" + " }\n" + " }\n" + " }\n" + @@ -70,21 +70,28 @@ public void testInvertIfTest() { public void testInvertIfDoubleNegationTest() { verifyOutput( U.class, - defaultSettings(), + lineNumberSettings(), "private class U\n" + "{\n" + " void test(final Object o) {\n" + - " if (o instanceof String) {\n" + - " System.out.println(o);\n" + + " /*SL:35*/if (o instanceof String) {\n" + + " System.out.println(/*EL:36*/o);\n" + " } else {\n" + - " if (o instanceof CharSequence) {\n" + - " System.out.println(o);\n" + + " /*SL:38*/if (o instanceof CharSequence) {\n" + + " System.out.println(/*EL:39*/o);\n" + " } else {\n" + - " throw new RuntimeException();\n" + + " /*SL:41*/throw new RuntimeException();\n" + " }\n" + " }\n" + " }\n" + "}" ); } + + + private DecompilerSettings lineNumberSettings() { + DecompilerSettings lineNumberSettings = defaultSettings(); + lineNumberSettings.setShowDebugLineNumbers(true); + return lineNumberSettings; + } } \ No newline at end of file From 4d55f8f5ba691a6fefae664a2664ab19fedc6eb4 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 13 Apr 2022 21:03:13 +0200 Subject: [PATCH 12/58] return the TypeDecompilationResults in Decompiler.decompile(...) --- .../java/com/strobel/decompiler/Decompiler.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java index 7b348f4d..8d801830 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java @@ -19,14 +19,21 @@ import com.strobel.assembler.InputTypeLoader; import com.strobel.assembler.metadata.*; import com.strobel.core.VerifyArgument; +import com.strobel.decompiler.languages.TypeDecompilationResults; import com.strobel.decompiler.languages.java.JavaFormattingOptions; +import java.util.Collections; + public final class Decompiler { - public static void decompile(final String internalName, final ITextOutput output) { - decompile(internalName, output, new DecompilerSettings()); + + private Decompiler() { + } + + public static TypeDecompilationResults decompile(final String internalName, final ITextOutput output) { + return decompile(internalName, output, new DecompilerSettings()); } - public static void decompile(final String internalName, final ITextOutput output, final DecompilerSettings settings) { + public static TypeDecompilationResults decompile(final String internalName, final ITextOutput output, final DecompilerSettings settings) { VerifyArgument.notNull(internalName, "internalName"); VerifyArgument.notNull(settings, "settings"); @@ -53,7 +60,7 @@ public static void decompile(final String internalName, final ITextOutput output if (type == null || (resolvedType = type.resolve()) == null) { output.writeLine("!!! ERROR: Failed to load class %s.", internalName); - return; + return new TypeDecompilationResults(null); } DeobfuscationUtilities.processType(resolvedType); @@ -67,6 +74,6 @@ public static void decompile(final String internalName, final ITextOutput output settings.setJavaFormattingOptions(JavaFormattingOptions.createDefault()); } - settings.getLanguage().decompileType(resolvedType, output, options); + return settings.getLanguage().decompileType(resolvedType, output, options); } } From 8d66d28e9e9f53163a63a89421d5c5070c2e26d2 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 1 Jun 2022 20:54:59 +0200 Subject: [PATCH 13/58] added javadocJar and sourcesJar --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 550c0a4f..99377a22 100644 --- a/build.gradle +++ b/build.gradle @@ -124,6 +124,8 @@ subprojects { if (project.name == "Procyon.Decompiler") { artifacts { archives jar + archives javadocJar + archives sourcesJar } } else { From b75f0da90eab1d6248777a4ed0f2c3d97693f86d Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 5 Jun 2022 11:54:04 +0200 Subject: [PATCH 14/58] Created InMemoryLineNumberFormatter to avoid temp file creation --- .../AbstractLineNumberFormatter.java | 225 ++++++++++++++++++ .../strobel/decompiler/DecompilerDriver.java | 17 +- .../InMemoryLineNumberFormatter.java | 58 +++++ .../decompiler/LineNumberFormatter.java | 217 ++--------------- .../strobel/decompiler/LineNumberOption.java | 23 ++ .../decompiler/LineNumberPrintWriter.java | 16 ++ .../decompiler/NoRetryMetadataSystem.java | 16 ++ 7 files changed, 379 insertions(+), 193 deletions(-) create mode 100644 Procyon.Decompiler/src/main/java/com/strobel/decompiler/AbstractLineNumberFormatter.java create mode 100644 Procyon.Decompiler/src/main/java/com/strobel/decompiler/InMemoryLineNumberFormatter.java create mode 100644 Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberOption.java diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/AbstractLineNumberFormatter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/AbstractLineNumberFormatter.java new file mode 100644 index 00000000..bd3121b4 --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/AbstractLineNumberFormatter.java @@ -0,0 +1,225 @@ +/* + * AbstractLineNumberFormatter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +import com.strobel.decompiler.languages.LineNumberPosition; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; + +public abstract class AbstractLineNumberFormatter { + + private final List _positions; + private final EnumSet _options; + + /** + * Constructs an instance. + * + * @param lineNumberPositions a recipe for how to fix the line numbers in 'file'. + * @param options controls how 'this' represents line numbers in the resulting file + */ + protected AbstractLineNumberFormatter( + List lineNumberPositions, + EnumSet options) { + _positions = lineNumberPositions; + _options = (options == null ? EnumSet.noneOf(LineNumberOption.class) : options); + } + + /** + * Rewrites the file passed to 'this' constructor so that the actual line + * numbers match the recipe passed to 'this' constructor. + * + * @return The formatted source code + */ + public String reformatFile() throws IOException { + List lineBrokenPositions = new ArrayList<>(); + List brokenLines = breakLines(lineBrokenPositions); + try (StringWriter sw = new StringWriter()) { + emitFormatted(brokenLines, lineBrokenPositions, sw); + return sw.toString(); + } + } + + /** + * Processes {@link #_file}, breaking apart any lines on which multiple line-number markers + * appear in different columns. + * + * @return the list of broken lines + */ + private List breakLines(List o_LineBrokenPositions) throws IOException { + int numLinesRead = 0; + int lineOffset = 0; + List brokenLines = new ArrayList<>(); + + try (BufferedReader r = createReader()) { + for (int posIndex = 0; posIndex < _positions.size(); posIndex++) { + LineNumberPosition pos = _positions.get(posIndex); + o_LineBrokenPositions.add( new LineNumberPosition( + pos.getOriginalLine(), pos.getEmittedLine()+lineOffset, pos.getEmittedColumn())); + + // Copy the input file up to but not including the emitted line # in "pos". + while (numLinesRead < pos.getEmittedLine() - 1) { + brokenLines.add(r.readLine()); + numLinesRead++; + } + + // Read the line that contains the next line number annotations, but don't write it yet. + String line = r.readLine(); + numLinesRead++; + + // See if there are two original line annotations on the same emitted line. + LineNumberPosition nextPos; + int prevPartLen = 0; + char[] indent = {}; + do { + nextPos = (posIndex < _positions.size() - 1) ? _positions.get(posIndex + 1) : null; + if ( nextPos != null + && nextPos.getEmittedLine() == pos.getEmittedLine() + && nextPos.getOriginalLine() > pos.getOriginalLine()) { + // Two different source line numbers on the same emitted line! + posIndex++; + lineOffset++; + String firstPart = line.substring(0, nextPos.getEmittedColumn() - prevPartLen - 1); + brokenLines.add(new String(indent) + firstPart); + prevPartLen += firstPart.length(); + indent = new char[prevPartLen]; + Arrays.fill(indent, ' '); + line = line.substring(firstPart.length(), line.length()); + + // Alter the position while adding it. + o_LineBrokenPositions.add( new LineNumberPosition( + nextPos.getOriginalLine(), nextPos.getEmittedLine()+lineOffset, nextPos.getEmittedColumn())); + } else { + nextPos = null; + } + } while (nextPos != null); + + // Nothing special here-- just emit the line. + brokenLines.add(new String(indent) + line); + } + + // Copy out the remainder of the file. + String line; + while ((line = r.readLine()) != null) { + brokenLines.add(line); + } + } + return brokenLines; + } + + protected abstract BufferedReader createReader() throws IOException; + + private void emitFormatted(List brokenLines, List lineBrokenPositions, Writer writer) { + int globalOffset = 0; + int numLinesRead = 0; + Iterator lines = brokenLines.iterator(); + + int maxLineNo = LineNumberPosition.computeMaxLineNumber(lineBrokenPositions); + try (LineNumberPrintWriter w = new LineNumberPrintWriter(maxLineNo, writer)) { + + // Suppress all line numbers if we weren't asked to show them. + if (!_options.contains(LineNumberOption.LEADING_COMMENTS)) { + w.suppressLineNumbers(); + } + + // Suppress stretching if we weren't asked to do it. + boolean doStretching = (_options.contains(LineNumberOption.STRETCHED)); + + for (LineNumberPosition pos : lineBrokenPositions) { + int nextTarget = pos.getOriginalLine(); + int nextActual = pos.getEmittedLine(); + int requiredAdjustment = (nextTarget - nextActual - globalOffset); + + if (doStretching && requiredAdjustment < 0) { + // We currently need to remove newlines to squeeze things together. + // prefer to remove empty lines, + // 1. read all lines before nextActual and remove empty lines as needed + List stripped = new ArrayList<>(); + while (numLinesRead < nextActual - 1) { + String line = lines.next(); + numLinesRead++; + if ((requiredAdjustment < 0) && line.trim().isEmpty()) { + requiredAdjustment++; + globalOffset--; + } else { + stripped.add(line); + } + } + // 2. print non empty lines while stripping further as needed + int lineNoToPrint = (stripped.size() + requiredAdjustment <= 0) + ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; + for (String line : stripped) { + if (requiredAdjustment < 0) { + w.print(lineNoToPrint, line); + w.print(" "); + requiredAdjustment++; + globalOffset--; + } else { + w.println(lineNoToPrint, line); + } + } + // 3. read and print next actual + String line = lines.next(); + numLinesRead++; + if (requiredAdjustment < 0) { + w.print(nextTarget, line); + w.print(" "); + globalOffset--; + } else { + w.println(nextTarget, line); + } + + } else { + while (numLinesRead < nextActual) { + String line = lines.next(); + numLinesRead++; + boolean isLast = (numLinesRead >= nextActual); + int lineNoToPrint = isLast ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; + + if (requiredAdjustment > 0 && doStretching) { + // We currently need to inject newlines to space things out. + do { + w.println(""); + requiredAdjustment--; + globalOffset++; + } while (isLast && requiredAdjustment > 0); + w.println(lineNoToPrint, line); + } else { + // No tweaks needed-- we are on the ball. + w.println(lineNoToPrint, line); + } + } + } + } + + // Finish out the file. + String line; + while (lines.hasNext()) { + line = lines.next(); + w.println(line); + } + } + } + +} diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java index 12c7d0aa..84d1b55f 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java @@ -1,3 +1,19 @@ +/* + * DecompilerDriver.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + package com.strobel.decompiler; import com.beust.jcommander.JCommander; @@ -15,7 +31,6 @@ import com.strobel.assembler.metadata.TypeReference; import com.strobel.core.ExceptionUtilities; import com.strobel.core.StringUtilities; -import com.strobel.decompiler.LineNumberFormatter.LineNumberOption; import com.strobel.decompiler.languages.BytecodeLanguage; import com.strobel.decompiler.languages.BytecodeOutputOptions; import com.strobel.decompiler.languages.Languages; diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/InMemoryLineNumberFormatter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/InMemoryLineNumberFormatter.java new file mode 100644 index 00000000..78d44a56 --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/InMemoryLineNumberFormatter.java @@ -0,0 +1,58 @@ +/* + * InMemoryLineNumberFormatter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +import com.strobel.decompiler.languages.LineNumberPosition; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.EnumSet; +import java.util.List; + +/** + * An InMemoryLineNumberFormatter is used to rewrite an existing .java source, introducing + * line number information. It can handle either, or both, of the following jobs: + * + *
    + *
  • Introduce line numbers as leading comments. + *
  • Stretch the source so that the line number comments match the physical lines. + *
+ */ +public class InMemoryLineNumberFormatter extends AbstractLineNumberFormatter { + + private final String _source; + + /** + * Constructs an instance. + * + * @param source the source whose line numbers should be fixed + * @param lineNumberPositions a recipe for how to fix the line numbers in source. + * @param options controls how 'this' represents line numbers in the resulting source + */ + public InMemoryLineNumberFormatter(String source, + List lineNumberPositions, + EnumSet options) { + super(lineNumberPositions, options); + _source = source; + } + + @Override + protected BufferedReader createReader() throws IOException { + return new BufferedReader(new StringReader(_source)); + } +} diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java index 5e12ba05..3b16f7e2 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java @@ -1,19 +1,30 @@ +/* + * LineNumberFormatter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + package com.strobel.decompiler; +import com.strobel.decompiler.languages.LineNumberPosition; + import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Arrays; +import java.nio.file.Files; import java.util.EnumSet; -import java.util.Iterator; import java.util.List; -import com.strobel.decompiler.languages.LineNumberPosition; - /** * A LineNumberFormatter is used to rewrite an existing .java file, introducing * line number information. It can handle either, or both, of the following jobs: @@ -23,16 +34,9 @@ *
  • Stretch the file so that the line number comments match the physical lines. * */ -public class LineNumberFormatter { - private final List _positions; - private final File _file; - private final EnumSet _options; +public class LineNumberFormatter extends AbstractLineNumberFormatter { - public enum LineNumberOption - { - LEADING_COMMENTS, - STRETCHED, - } + private final File _file; /** * Constructs an instance. @@ -44,183 +48,12 @@ public enum LineNumberOption public LineNumberFormatter(File file, List lineNumberPositions, EnumSet options) { + super(lineNumberPositions, options); _file = file; - _positions = lineNumberPositions; - _options = (options == null ? EnumSet.noneOf(LineNumberOption.class) : options); } - /** - * Rewrites the file passed to 'this' constructor so that the actual line - * numbers match the recipe passed to 'this' constructor. - * - * @return The formatted source code - */ - public String reformatFile() throws IOException { - List lineBrokenPositions = new ArrayList<>(); - List brokenLines = breakLines(lineBrokenPositions); - try (StringWriter sw = new StringWriter()) { - emitFormatted(brokenLines, lineBrokenPositions, sw); - return sw.toString(); - } + @Override + protected BufferedReader createReader() throws IOException { + return Files.newBufferedReader(_file.toPath()); } - - /** - * Processes {@link #_file}, breaking apart any lines on which multiple line-number markers - * appear in different columns. - * - * @return the list of broken lines - */ - private List breakLines(List o_LineBrokenPositions) throws IOException { - int numLinesRead = 0; - int lineOffset = 0; - List brokenLines = new ArrayList<>(); - - try (BufferedReader r = new BufferedReader(new FileReader(_file))) { - for (int posIndex = 0; posIndex < _positions.size(); posIndex++) { - LineNumberPosition pos = _positions.get(posIndex); - o_LineBrokenPositions.add( new LineNumberPosition( - pos.getOriginalLine(), pos.getEmittedLine()+lineOffset, pos.getEmittedColumn())); - - // Copy the input file up to but not including the emitted line # in "pos". - while (numLinesRead < pos.getEmittedLine() - 1) { - brokenLines.add(r.readLine()); - numLinesRead++; - } - - // Read the line that contains the next line number annotations, but don't write it yet. - String line = r.readLine(); - numLinesRead++; - - // See if there are two original line annotations on the same emitted line. - LineNumberPosition nextPos; - int prevPartLen = 0; - char[] indent = {}; - do { - nextPos = (posIndex < _positions.size() - 1) ? _positions.get(posIndex + 1) : null; - if ( nextPos != null - && nextPos.getEmittedLine() == pos.getEmittedLine() - && nextPos.getOriginalLine() > pos.getOriginalLine()) { - // Two different source line numbers on the same emitted line! - posIndex++; - lineOffset++; - String firstPart = line.substring(0, nextPos.getEmittedColumn() - prevPartLen - 1); - brokenLines.add(new String(indent) + firstPart); - prevPartLen += firstPart.length(); - indent = new char[prevPartLen]; - Arrays.fill(indent, ' '); - line = line.substring(firstPart.length(), line.length()); - - // Alter the position while adding it. - o_LineBrokenPositions.add( new LineNumberPosition( - nextPos.getOriginalLine(), nextPos.getEmittedLine()+lineOffset, nextPos.getEmittedColumn())); - } else { - nextPos = null; - } - } while (nextPos != null); - - // Nothing special here-- just emit the line. - brokenLines.add(new String(indent) + line); - } - - // Copy out the remainder of the file. - String line; - while ((line = r.readLine()) != null) { - brokenLines.add(line); - } - } - return brokenLines; - } - - private void emitFormatted(List brokenLines, List lineBrokenPositions, Writer writer) { - int globalOffset = 0; - int numLinesRead = 0; - Iterator lines = brokenLines.iterator(); - - int maxLineNo = LineNumberPosition.computeMaxLineNumber(lineBrokenPositions); - try (LineNumberPrintWriter w = new LineNumberPrintWriter(maxLineNo, writer)) { - - // Suppress all line numbers if we weren't asked to show them. - if (!_options.contains(LineNumberOption.LEADING_COMMENTS)) { - w.suppressLineNumbers(); - } - - // Suppress stretching if we weren't asked to do it. - boolean doStretching = (_options.contains(LineNumberOption.STRETCHED)); - - for (LineNumberPosition pos : lineBrokenPositions) { - int nextTarget = pos.getOriginalLine(); - int nextActual = pos.getEmittedLine(); - int requiredAdjustment = (nextTarget - nextActual - globalOffset); - - if (doStretching && requiredAdjustment < 0) { - // We currently need to remove newlines to squeeze things together. - // prefer to remove empty lines, - // 1. read all lines before nextActual and remove empty lines as needed - List stripped = new ArrayList<>(); - while (numLinesRead < nextActual - 1) { - String line = lines.next(); - numLinesRead++; - if ((requiredAdjustment < 0) && line.trim().isEmpty()) { - requiredAdjustment++; - globalOffset--; - } else { - stripped.add(line); - } - } - // 2. print non empty lines while stripping further as needed - int lineNoToPrint = (stripped.size() + requiredAdjustment <= 0) - ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; - for (String line : stripped) { - if (requiredAdjustment < 0) { - w.print(lineNoToPrint, line); - w.print(" "); - requiredAdjustment++; - globalOffset--; - } else { - w.println(lineNoToPrint, line); - } - } - // 3. read and print next actual - String line = lines.next(); - numLinesRead++; - if (requiredAdjustment < 0) { - w.print(nextTarget, line); - w.print(" "); - globalOffset--; - } else { - w.println(nextTarget, line); - } - - } else { - while (numLinesRead < nextActual) { - String line = lines.next(); - numLinesRead++; - boolean isLast = (numLinesRead >= nextActual); - int lineNoToPrint = isLast ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; - - if (requiredAdjustment > 0 && doStretching) { - // We currently need to inject newlines to space things out. - do { - w.println(""); - requiredAdjustment--; - globalOffset++; - } while (isLast && requiredAdjustment > 0); - w.println(lineNoToPrint, line); - } else { - // No tweaks needed-- we are on the ball. - w.println(lineNoToPrint, line); - } - } - } - } - - // Finish out the file. - String line; - while (lines.hasNext()) { - line = lines.next(); - w.println(line); - } - } - } - } diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberOption.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberOption.java new file mode 100644 index 00000000..e8e6f016 --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberOption.java @@ -0,0 +1,23 @@ +/* + * LineNumberOption.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +public enum LineNumberOption +{ + LEADING_COMMENTS, + STRETCHED, +} \ No newline at end of file diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java index bdc2baa3..0b00fdc4 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java @@ -1,3 +1,19 @@ +/* + * LineNumberPrintWriter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + package com.strobel.decompiler; import java.io.PrintWriter; diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java index 770d1bce..a17e1e7f 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java @@ -1,3 +1,19 @@ +/* + * NoRetryMetadataSystem.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + package com.strobel.decompiler; import com.strobel.assembler.metadata.ITypeLoader; From 75892a9fd3891f371258eac823ba325fa6ba887c Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Mon, 6 Jun 2022 20:03:00 +0200 Subject: [PATCH 15/58] prepare code for line stretch (line number realignment) --- .../assembler/metadata/MethodReference.java | 28 +- .../languages/java/JavaOutputVisitor.java | 1 + .../java/MinMaxLineNumberVisitor.java | 383 ++++++++++++++++++ .../languages/java/TextOutputFormatter.java | 8 +- .../languages/java/ast/EntityDeclaration.java | 23 ++ .../languages/java/ast/FieldDeclaration.java | 16 + .../languages/java/ast/MethodDeclaration.java | 14 + .../languages/java/ast/TypeDeclaration.java | 13 + ...ReOrderMembersForLineStretchTransform.java | 61 +++ .../RewriteInitForLineStretchTransform.java | 194 +++++++++ .../transforms/TransformationPipeline.java | 6 +- .../com/strobel/decompiler/NameTests.java | 42 +- .../com/strobel/decompiler/OperatorTests.java | 13 +- .../strobel/decompiler/PrimitiveTests.java | 14 +- .../com/strobel/decompiler/RealignTest.java | 239 +++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- 16 files changed, 1005 insertions(+), 52 deletions(-) create mode 100644 Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/MinMaxLineNumberVisitor.java create mode 100644 Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/ReOrderMembersForLineStretchTransform.java create mode 100644 Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java create mode 100644 Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java index a3a0caf9..9b4c67b2 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java @@ -17,7 +17,6 @@ package com.strobel.assembler.metadata; import com.strobel.core.StringUtilities; -import com.strobel.core.VerifyArgument; import com.strobel.util.ContractUtils; import java.util.Collections; @@ -28,21 +27,24 @@ * Date: 1/6/13 * Time: 2:29 PM */ -public abstract class MethodReference extends MemberReference implements IMethodSignature, - IGenericParameterProvider, - IGenericContext { - protected final static String CONSTRUCTOR_NAME = ""; - protected final static String STATIC_INITIALIZER_NAME = ""; +public abstract class MethodReference extends MemberReference implements IMethodSignature { + protected static final String CONSTRUCTOR_NAME = ""; + protected static final String STATIC_INITIALIZER_NAME = ""; // - public abstract TypeReference getReturnType(); - public boolean hasParameters() { return !getParameters().isEmpty(); } - public abstract List getParameters(); + public boolean hasParameter(String name) { + for (ParameterDefinition parameterDefinition : getParameters()) { + if (parameterDefinition.getName().equals(name)) { + return true; + } + } + return false; + } public List getThrownTypes() { return Collections.emptyList(); @@ -117,11 +119,11 @@ protected StringBuilder appendName(final StringBuilder sb, final boolean fullNam } public boolean isConstructor() { - return MethodDefinition.CONSTRUCTOR_NAME.equals(getName()); + return CONSTRUCTOR_NAME.equals(getName()); } public boolean isTypeInitializer() { - return MethodDefinition.STATIC_INITIALIZER_NAME.equals(getName()); + return STATIC_INITIALIZER_NAME.equals(getName()); } // @@ -171,9 +173,9 @@ public GenericParameter findTypeVariable(final String name) { public MethodDefinition resolve() { final TypeReference declaringType = getDeclaringType(); - if (declaringType == null) + if (declaringType == null) { throw ContractUtils.unsupported(); - + } return declaringType.resolve(this); } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java index 90cb2546..78b9a7cc 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java @@ -1654,6 +1654,7 @@ public Void visitParameterDeclaration(final ParameterDeclaration node, final Voi @Override public Void visitFieldDeclaration(final FieldDeclaration node, final Void ignored) { startNode(node); + formatter.resetLineNumberOffsets(OffsetToLineNumberConverter.NOOP_CONVERTER); writeAnnotations(node.getAnnotations(), true); writeModifiers(node.getModifiers()); diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/MinMaxLineNumberVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/MinMaxLineNumberVisitor.java new file mode 100644 index 00000000..38a27412 --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/MinMaxLineNumberVisitor.java @@ -0,0 +1,383 @@ +/* + * MinMaxLineNumberVisitor.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java; + +import com.strobel.decompiler.languages.java.ast.Annotation; +import com.strobel.decompiler.languages.java.ast.AnonymousObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayInitializerExpression; +import com.strobel.decompiler.languages.java.ast.AssertStatement; +import com.strobel.decompiler.languages.java.ast.AssignmentExpression; +import com.strobel.decompiler.languages.java.ast.BinaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.BreakStatement; +import com.strobel.decompiler.languages.java.ast.BytecodeConstant; +import com.strobel.decompiler.languages.java.ast.CastExpression; +import com.strobel.decompiler.languages.java.ast.ClassOfExpression; +import com.strobel.decompiler.languages.java.ast.ConditionalExpression; +import com.strobel.decompiler.languages.java.ast.ContinueStatement; +import com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor; +import com.strobel.decompiler.languages.java.ast.DoWhileStatement; +import com.strobel.decompiler.languages.java.ast.EmptyStatement; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.ExpressionStatement; +import com.strobel.decompiler.languages.java.ast.ForEachStatement; +import com.strobel.decompiler.languages.java.ast.ForStatement; +import com.strobel.decompiler.languages.java.ast.GotoStatement; +import com.strobel.decompiler.languages.java.ast.IdentifierExpression; +import com.strobel.decompiler.languages.java.ast.IfElseStatement; +import com.strobel.decompiler.languages.java.ast.IndexerExpression; +import com.strobel.decompiler.languages.java.ast.InlinedBytecodeExpression; +import com.strobel.decompiler.languages.java.ast.InstanceOfExpression; +import com.strobel.decompiler.languages.java.ast.InvocationExpression; +import com.strobel.decompiler.languages.java.ast.LabelStatement; +import com.strobel.decompiler.languages.java.ast.LabeledStatement; +import com.strobel.decompiler.languages.java.ast.LambdaExpression; +import com.strobel.decompiler.languages.java.ast.LocalTypeDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; +import com.strobel.decompiler.languages.java.ast.MethodGroupExpression; +import com.strobel.decompiler.languages.java.ast.NullReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.ParenthesizedExpression; +import com.strobel.decompiler.languages.java.ast.PrimitiveExpression; +import com.strobel.decompiler.languages.java.ast.ReturnStatement; +import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression; +import com.strobel.decompiler.languages.java.ast.SwitchExpression; +import com.strobel.decompiler.languages.java.ast.SwitchStatement; +import com.strobel.decompiler.languages.java.ast.SynchronizedStatement; +import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ThrowStatement; +import com.strobel.decompiler.languages.java.ast.TryCatchStatement; +import com.strobel.decompiler.languages.java.ast.TypeReferenceExpression; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.VariableDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.WhileStatement; + +public class MinMaxLineNumberVisitor extends DepthFirstAstVisitor { + + private final LineNumberTableConverter lineNumberTableConverter; + private int minLineNumber = Integer.MAX_VALUE; + private int maxLineNumber = Integer.MIN_VALUE; + + public MinMaxLineNumberVisitor(final LineNumberTableConverter lineNumberTableConverter) { + this.lineNumberTableConverter = lineNumberTableConverter; + } + + private void updateMinMaxLineNumbers(int offset) { + if (offset != Expression.MYSTERY_OFFSET) { + int lineNumber = lineNumberTableConverter.getLineForOffset(offset); + minLineNumber = Math.min(minLineNumber, lineNumber); + maxLineNumber = Math.max(maxLineNumber, lineNumber); + } + } + + @Override + public Void visitInvocationExpression(InvocationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitInvocationExpression(node, data); + } + + @Override + public Void visitTypeReference(TypeReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitTypeReference(node, data); + } + + @Override + public Void visitMemberReferenceExpression(MemberReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitMemberReferenceExpression(node, data); + } + + @Override + public Void visitNullReferenceExpression(NullReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitNullReferenceExpression(node, data); + } + + @Override + public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitThisReferenceExpression(node, data); + } + + @Override + public Void visitSuperReferenceExpression(SuperReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSuperReferenceExpression(node, data); + } + + @Override + public Void visitClassOfExpression(ClassOfExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitClassOfExpression(node, data); + } + + @Override + public Void visitBlockStatement(BlockStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBlockStatement(node, data); + } + + @Override + public Void visitExpressionStatement(ExpressionStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitExpressionStatement(node, data); + } + + @Override + public Void visitBreakStatement(BreakStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBreakStatement(node, data); + } + + @Override + public Void visitContinueStatement(ContinueStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitContinueStatement(node, data); + } + + @Override + public Void visitDoWhileStatement(DoWhileStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitDoWhileStatement(node, data); + } + + @Override + public Void visitEmptyStatement(EmptyStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitEmptyStatement(node, data); + } + + @Override + public Void visitIfElseStatement(IfElseStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitIfElseStatement(node, data); + } + + @Override + public Void visitLabelStatement(LabelStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLabelStatement(node, data); + } + + @Override + public Void visitLabeledStatement(LabeledStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLabeledStatement(node, data); + } + + @Override + public Void visitReturnStatement(ReturnStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitReturnStatement(node, data); + } + + @Override + public Void visitSwitchStatement(SwitchStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSwitchStatement(node, data); + } + + @Override + public Void visitSwitchExpression(SwitchExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSwitchExpression(node, data); + } + + @Override + public Void visitThrowStatement(ThrowStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitThrowStatement(node, data); + } + + @Override + public Void visitAnnotation(Annotation node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAnnotation(node, data); + } + + @Override + public Void visitVariableDeclaration(VariableDeclarationStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitVariableDeclaration(node, data); + } + + @Override + public Void visitWhileStatement(WhileStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitWhileStatement(node, data); + } + + @Override + public Void visitPrimitiveExpression(PrimitiveExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitPrimitiveExpression(node, data); + } + + @Override + public Void visitCastExpression(CastExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitCastExpression(node, data); + } + + @Override + public Void visitBinaryOperatorExpression(BinaryOperatorExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBinaryOperatorExpression(node, data); + } + + @Override + public Void visitInstanceOfExpression(InstanceOfExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitInstanceOfExpression(node, data); + } + + @Override + public Void visitIndexerExpression(IndexerExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitIndexerExpression(node, data); + } + + @Override + public Void visitIdentifierExpression(IdentifierExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitIdentifierExpression(node, data); + } + + @Override + public Void visitUnaryOperatorExpression(UnaryOperatorExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitUnaryOperatorExpression(node, data); + } + + @Override + public Void visitConditionalExpression(ConditionalExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitConditionalExpression(node, data); + } + + @Override + public Void visitArrayInitializerExpression(ArrayInitializerExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitArrayInitializerExpression(node, data); + } + + @Override + public Void visitObjectCreationExpression(ObjectCreationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitObjectCreationExpression(node, data); + } + + @Override + public Void visitArrayCreationExpression(ArrayCreationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitArrayCreationExpression(node, data); + } + + @Override + public Void visitAssignmentExpression(AssignmentExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAssignmentExpression(node, data); + } + + @Override + public Void visitForStatement(ForStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitForStatement(node, data); + } + + @Override + public Void visitForEachStatement(ForEachStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitForEachStatement(node, data); + } + + @Override + public Void visitTryCatchStatement(TryCatchStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitTryCatchStatement(node, data); + } + + @Override + public Void visitGotoStatement(GotoStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitGotoStatement(node, data); + } + + @Override + public Void visitParenthesizedExpression(ParenthesizedExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitParenthesizedExpression(node, data); + } + + @Override + public Void visitSynchronizedStatement(SynchronizedStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSynchronizedStatement(node, data); + } + + @Override + public Void visitAnonymousObjectCreationExpression(AnonymousObjectCreationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAnonymousObjectCreationExpression(node, data); + } + + @Override + public Void visitMethodGroupExpression(MethodGroupExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitMethodGroupExpression(node, data); + } + + @Override + public Void visitAssertStatement(AssertStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAssertStatement(node, data); + } + + @Override + public Void visitLambdaExpression(LambdaExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLambdaExpression(node, data); + } + + @Override + public Void visitLocalTypeDeclarationStatement(LocalTypeDeclarationStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLocalTypeDeclarationStatement(node, data); + } + + @Override + public Void visitInlinedBytecode(InlinedBytecodeExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitInlinedBytecode(node, data); + } + + @Override + public Void visitBytecodeConstant(BytecodeConstant node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBytecodeConstant(node, data); + } + + public int getMinLineNumber() { + return minLineNumber; + } + + public int getMaxLineNumber() { + return maxLineNumber; + } +} \ No newline at end of file diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java index 763f942c..7bf26df6 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java @@ -99,10 +99,16 @@ public void startNode(final AstNode node) { else if (node instanceof Statement) { offset = ((Statement) node).getOffset(); prefix = "/*SL:"; + } else if (node instanceof FieldDeclaration + && node.getLastChild() instanceof VariableInitializer + && node.getLastChild().getLastChild() instanceof Expression) { + offset = ((Expression) node.getLastChild().getLastChild()).getOffset(); + prefix = "/*SL:"; } if (offset != Expression.MYSTERY_OFFSET) { // Convert to a line number. - final int lineNumber = offset2LineNumber.getLineForOffset(offset); + final int lineNumber = node instanceof FieldDeclaration ? ((FieldDeclaration) node).getLineNumber() + : offset2LineNumber.getLineForOffset(offset); if (lineNumber > lastObservedLineNumber) { // Record a data structure mapping original to actual line numbers. final int lineOfComment = output.getRow(); diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java index f12a18e6..b4b38c8c 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java @@ -16,7 +16,12 @@ package com.strobel.decompiler.languages.java.ast; +import com.strobel.assembler.ir.attributes.AttributeNames; +import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; +import com.strobel.assembler.ir.attributes.LineNumberTableEntry; +import com.strobel.assembler.ir.attributes.SourceAttribute; import com.strobel.assembler.metadata.Flags; +import com.strobel.assembler.metadata.MethodDefinition; import com.strobel.decompiler.languages.EntityType; import com.strobel.decompiler.languages.TextLocation; import com.strobel.decompiler.patterns.Match; @@ -179,4 +184,22 @@ static boolean removeModifier(final AstNode node, final Flags.Flag modifier) { return false; } + + public int getFirstKnownLineNumber() { + MethodDefinition methodDefinition = getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null) { + final LineNumberTableAttribute lineNumberTableAttribute = SourceAttribute.find(AttributeNames.LineNumberTable, methodDefinition.getSourceAttributes()); + if (lineNumberTableAttribute != null) { + List entries = lineNumberTableAttribute.getEntries(); + if (entries != null) { + for (LineNumberTableEntry entry : entries) { + if (entry != null) { + return entry.getLineNumber(); + } + } + } + } + } + return 0; + } } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java index 59dec7a9..6cce00bf 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java @@ -21,6 +21,9 @@ import com.strobel.decompiler.patterns.Match; public class FieldDeclaration extends EntityDeclaration { + + private int lineNumber; + public final AstNodeCollection getVariables() { return getChildrenByRole(Roles.VARIABLE); } @@ -48,4 +51,17 @@ public boolean matches(final INode other, final Match match) { return false; } + + public int getLineNumber() { + return lineNumber; + } + + public void setLineNumber(int lineNumber) { + this.lineNumber = lineNumber; + } + + @Override + public int getFirstKnownLineNumber() { + return lineNumber; + } } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java index 0538cb54..8be93db5 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java @@ -30,6 +30,8 @@ public class MethodDeclaration extends EntityDeclaration { public final static TokenRole DEFAULT_KEYWORD = new TokenRole("default", TokenRole.FLAG_KEYWORD); public final static TokenRole THROWS_KEYWORD = new TokenRole("throws", TokenRole.FLAG_KEYWORD); + private int firstKnownLineNumber; + public final AstType getPrivateImplementationType() { return getChildByRole(PRIVATE_IMPLEMENTATION_TYPE_ROLE); } @@ -111,6 +113,18 @@ public boolean matches(final INode other, final Match match) { return false; } + + @Override + public int getFirstKnownLineNumber() { + if (firstKnownLineNumber > 0) { + return firstKnownLineNumber; + } + return super.getFirstKnownLineNumber(); + } + + public void setFirstKnownLineNumber(int firstKnownLineNumber) { + this.firstKnownLineNumber = firstKnownLineNumber; + } // diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java index f03d604a..829f85ad 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java @@ -123,6 +123,19 @@ public boolean matches(final INode other, final Match match) { return false; } + @Override + public int getFirstKnownLineNumber() { + for (EntityDeclaration entityDeclaration : getMembers()) { + if (entityDeclaration != null) { + int firstKnownLineNumber = entityDeclaration.getFirstKnownLineNumber(); + if (firstKnownLineNumber > 0) { + return firstKnownLineNumber; + } + } + } + return 0; + } + // public final static TypeDeclaration NULL = new NullTypeDeclaration(); diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/ReOrderMembersForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/ReOrderMembersForLineStretchTransform.java new file mode 100644 index 00000000..c1cbd2bf --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/ReOrderMembersForLineStretchTransform.java @@ -0,0 +1,61 @@ +/* + * ReOrderMembersForLineStretchTransform.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java.ast.transforms; + +import com.strobel.decompiler.DecompilerContext; +import com.strobel.decompiler.languages.java.ast.AstNodeCollection; +import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; +import com.strobel.decompiler.languages.java.ast.EntityDeclaration; +import com.strobel.decompiler.languages.java.ast.Roles; +import com.strobel.decompiler.languages.java.ast.TypeDeclaration; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class ReOrderMembersForLineStretchTransform extends ContextTrackingVisitor { + + public ReOrderMembersForLineStretchTransform(DecompilerContext context) { + super(context); + } + + @Override + protected Void visitTypeDeclarationOverride(TypeDeclaration typeDeclaration, Void p) { + AstNodeCollection members = typeDeclaration.getChildrenByRole(Roles.TYPE_MEMBER); + List sortedMembers = new ArrayList<>(members); + Collections.sort(sortedMembers, new MemberComparator()); + for (EntityDeclaration member : members) { + member.remove(); + } + for (EntityDeclaration member : sortedMembers) { + typeDeclaration.addChild(member, Roles.TYPE_MEMBER); + } + return p; + } + + private static class MemberComparator implements Comparator, Serializable { + + private static final long serialVersionUID = 1L; + + @Override + public int compare(EntityDeclaration e1, EntityDeclaration e2) { + return Integer.compare(e1.getFirstKnownLineNumber(), e2.getFirstKnownLineNumber()); + } + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java new file mode 100644 index 00000000..d2407c99 --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -0,0 +1,194 @@ +/* + * RewriteInitForLineStretchTransform.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java.ast.transforms; + +import com.strobel.assembler.ir.attributes.AttributeNames; +import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; +import com.strobel.assembler.ir.attributes.SourceAttribute; +import com.strobel.assembler.metadata.FieldDefinition; +import com.strobel.assembler.metadata.MemberReference; +import com.strobel.assembler.metadata.MethodDefinition; +import com.strobel.assembler.metadata.ParameterDefinition; +import com.strobel.decompiler.DecompilerContext; +import com.strobel.decompiler.languages.java.LineNumberTableConverter; +import com.strobel.decompiler.languages.java.MinMaxLineNumberVisitor; +import com.strobel.decompiler.languages.java.ast.AssignmentExpression; +import com.strobel.decompiler.languages.java.ast.AstNode; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; +import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.ExpressionStatement; +import com.strobel.decompiler.languages.java.ast.FieldDeclaration; +import com.strobel.decompiler.languages.java.ast.Keys; +import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; +import com.strobel.decompiler.languages.java.ast.MethodDeclaration; +import com.strobel.decompiler.languages.java.ast.Roles; +import com.strobel.decompiler.languages.java.ast.VariableInitializer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RewriteInitForLineStretchTransform extends ContextTrackingVisitor { + + private Map fieldDeclarations = new HashMap<>(); + private int constructorCount; + + public RewriteInitForLineStretchTransform(DecompilerContext context) { + super(context); + } + + @Override + public Void visitBlockStatement(BlockStatement node, Void data) { + if (node.getParent() instanceof MethodDeclaration) { + MethodDeclaration methodDeclaration = (MethodDeclaration) node.getParent(); + MethodDefinition methodDefinition = methodDeclaration.getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null && methodDefinition.isTypeInitializer()) { + final LineNumberTableAttribute lineNumberTable = SourceAttribute.find(AttributeNames.LineNumberTable, methodDefinition.getSourceAttributes()); + if (lineNumberTable != null) { + LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTable); + int previousLineNumber = 0; + int pivotLineNumber = 0; + MethodDeclaration newMethodDeclaration = null; + for (AstNode child : node.getChildren()) { + MinMaxLineNumberVisitor minMaxLineNumberVisitor = new MinMaxLineNumberVisitor(lineNumberTableConverter); + child.acceptVisitor(minMaxLineNumberVisitor, null); + int currentLineNumber = minMaxLineNumberVisitor.getMinLineNumber(); + if (previousLineNumber > 0 && currentLineNumber > previousLineNumber + 3) { + newMethodDeclaration = (MethodDeclaration) methodDeclaration.clone(); + newMethodDeclaration.setFirstKnownLineNumber(currentLineNumber); + methodDeclaration.getParent().insertChildAfter(methodDeclaration, newMethodDeclaration, Roles.TYPE_MEMBER); + pivotLineNumber = currentLineNumber; + break; + } + previousLineNumber = minMaxLineNumberVisitor.getMaxLineNumber(); + } + if (pivotLineNumber > 0) { + for (AstNode child : node.getChildren()) { + MinMaxLineNumberVisitor minMaxLineNumberVisitor = new MinMaxLineNumberVisitor(lineNumberTableConverter); + child.acceptVisitor(minMaxLineNumberVisitor, null); + int currentLineNumber = minMaxLineNumberVisitor.getMinLineNumber(); + if (currentLineNumber >= pivotLineNumber) { + child.remove(); + } + } + } + if (newMethodDeclaration != null) { + BlockStatement body = newMethodDeclaration.getBody(); + if (body != null) { + for (AstNode child : body.getChildren()) { + MinMaxLineNumberVisitor minMaxLineNumberVisitor = new MinMaxLineNumberVisitor(lineNumberTableConverter); + child.acceptVisitor(minMaxLineNumberVisitor, null); + int currentLineNumber = minMaxLineNumberVisitor.getMinLineNumber(); + if (currentLineNumber < pivotLineNumber) { + child.remove(); + } + } + visitBlockStatement(body, data); + } + } + } + } + } + return super.visitBlockStatement(node, data); + } + + @Override + public Void visitAssignmentExpression(AssignmentExpression node, Void data) { + AstNode parent = node.getParent(); + if (parent instanceof ExpressionStatement && parent.getParent() instanceof BlockStatement && parent.getParent().getParent() instanceof ConstructorDeclaration + && node.getLeft() instanceof MemberReferenceExpression) { + ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration) parent.getParent().getParent(); + MethodDefinition constructor = constructorDeclaration.getUserData(Keys.METHOD_DEFINITION); + final LineNumberTableAttribute lineNumberTable = SourceAttribute.find(AttributeNames.LineNumberTable, + constructor != null ? constructor.getSourceAttributes() : Collections.emptyList()); + LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTable); + MemberReferenceExpression memberReferenceExpression = (MemberReferenceExpression) node.getFirstChild(); + MemberReference memberReference = memberReferenceExpression.getUserData(Keys.MEMBER_REFERENCE); + FieldInit fieldInit = fieldDeclarations.get(memberReference.getFullName()); + if (fieldInit != null && (constructor == null || !constructor.hasParameter(memberReference.getName()))) { + Expression initializer = node.getRight(); + int fieldInitLineNo = lineNumberTableConverter.getLineForOffset(initializer.getOffset()); + if (fieldInitLineNo > 0) { + FieldDeclaration fieldDeclaration = fieldInit.declaration; + int fieldDeclLineNo = fieldDeclaration.getLineNumber(); + if (fieldInitLineNo == fieldDeclLineNo || (fieldInit.initializers.isEmpty() && fieldDeclLineNo == 0)) { + fieldDeclaration.setLineNumber(fieldInitLineNo); + fieldInit.initializers.add(initializer); + fieldInit.statements.add((ExpressionStatement) node.getParent()); + } + } + } + } + return super.visitAssignmentExpression(node, data); + } + + @Override + public Void visitFieldDeclaration(FieldDeclaration node, Void data) { + FieldDefinition fieldDefinition = node.getUserData(Keys.FIELD_DEFINITION); + if (fieldDefinition != null) { + fieldDeclarations.put(fieldDefinition.getFullName(), new FieldInit(node)); + } + return super.visitFieldDeclaration(node, data); + } + + @Override + public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { + constructorCount++; + return super.visitConstructorDeclaration(node, p); + } + + @Override + public void run(AstNode compilationUnit) { + super.run(compilationUnit); + if (constructorCount > 0) { + for (FieldInit fieldInit : fieldDeclarations.values()) { + if (fieldInit.initializers.size() == constructorCount) { + fieldInit.removeInitializers(); + fieldInit.removeStatements(); + fieldInit.declaration.getVariables().clear(); + fieldInit.declaration.getVariables().add(new VariableInitializer(fieldInit.declaration.getName(), fieldInit.initializers.get(0))); + } + } + } + } + + private static class FieldInit { + private final FieldDeclaration declaration; + private final List initializers = new ArrayList<>(); + private final List statements = new ArrayList<>(); + + public FieldInit(FieldDeclaration declaration) { + this.declaration = declaration; + } + + public void removeStatements() { + for (ExpressionStatement expressionStatement : statements) { + expressionStatement.remove(); + } + } + + public void removeInitializers() { + for (Expression initializer : initializers) { + initializer.remove(); + } + } + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java index 6a2ff63f..3750c7b1 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java @@ -1,7 +1,7 @@ /* * TransformationPipeline.java * - * Copyright (c) 2013 Mike Strobel + * Copyright (c) 2013-2022 Mike Strobel and other contributors * * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. @@ -76,7 +76,9 @@ public static IAstTransform[] createPipeline(final DecompilerContext context) { new AddStandardAnnotationsTransform(context), new AddReferenceQualifiersTransform(context), new RemoveHiddenMembersTransform(context), - new CollapseImportsTransform(context) + new CollapseImportsTransform(context), + new RewriteInitForLineStretchTransform(context), + new ReOrderMembersForLineStretchTransform(context) }; } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java index 5c1822f4..9640e53f 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java @@ -149,6 +149,9 @@ public void testVariablesHideClasses() throws Throwable { A.class, defaultSettings(), "static final class A {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " static final class Inner {\n" + " void f(final int x, final Object Integer) {\n" + " final x z = new x();\n" + @@ -158,9 +161,6 @@ public void testVariablesHideClasses() throws Throwable { " System.out.println(Integer instanceof Integer);\n" + " }\n" + " }\n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -171,6 +171,8 @@ public void testLocalImportedAndNestedTypeNameCollisions() throws Throwable { B.class, defaultSettings(), "static final class B {\n" + + " static class Integer {\n" + + " }\n" + " void f(final Object o) {\n" + " class Integer {\n" + " }\n" + @@ -184,8 +186,6 @@ public void testLocalImportedAndNestedTypeNameCollisions() throws Throwable { " System.out.println(java.lang.Integer.class);\n" + " }\n" + " }\n" + - " static class Integer {\n" + - " }\n" + "}\n" ); } @@ -197,13 +197,13 @@ public void testFieldHidesImportedTypeName() throws Throwable { defaultSettings(), "static final class C {\n" + " static float Float;\n" + + " static {\n" + + " C.Float = java.lang.Float.NaN;\n" + + " }\n" + " void f() {\n" + " System.out.println(C.Float);\n" + " System.out.println(java.lang.Float.NaN);\n" + " }\n" + - " static {\n" + - " C.Float = java.lang.Float.NaN;\n" + - " }\n" + "}\n" ); } @@ -214,13 +214,13 @@ public void testFormalParameterHidesNestedClass() throws Throwable { D.class, defaultSettings(), "static final class D {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " void f(final int x) {\n" + " System.out.println(x * 2);\n" + " System.out.println(D.x.y);\n" + " }\n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -247,14 +247,14 @@ public void testMethodTypeParameterHidesInnerClass() throws Throwable { F.class, defaultSettings(), "static final class F {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " void f(final x z) {\n" + " System.out.println(z);\n" + " System.out.println(F.x.y);\n" + " }\n" + " \n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -265,14 +265,14 @@ public void testClassTypeParameterHidesInnerClass() throws Throwable { G.class, defaultSettings(), "static final class G {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " void f(final x z) {\n" + " System.out.println(z);\n" + " System.out.println(G.x.y);\n" + " }\n" + " \n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -284,12 +284,12 @@ public void testInnerClassHidesBaseInnerClass() throws Throwable { defaultSettings(), "static final class H extends DeclaresX {\n" + " X z;\n" + + " static class X {\n" + + " }\n" + " void f(final DeclaresX.X x) {\n" + " System.out.println(x);\n" + " System.out.println(this.z);\n" + " }\n" + - " static class X {\n" + - " }\n" + "}\n" ); } @@ -316,13 +316,13 @@ public void testInnerClassHidesBaseInnerClassAndInterfaceInnerClass() throws Thr defaultSettings(), "static final class J extends DeclaresX implements IDeclaresX {\n" + " X z;\n" + + " static class X {\n" + + " }\n" + " void f(final DeclaresX.X x, final IDeclaresX.X y) {\n" + " System.out.println(x);\n" + " System.out.println(y);\n" + " System.out.println(this.z);\n" + " }\n" + - " static class X {\n" + - " }\n" + "}\n" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java index 5f45ec31..f24770e6 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java @@ -72,11 +72,11 @@ private static class G { private int x; private static int y; private int[] a; - private static int[] b = new int[] { 0 }; + private static int[] b = new int[] { 1 }; private G() { super(); - this.a = new int[] { 0 }; + this.a = new int[] { 1 }; } public int f() { @@ -255,11 +255,13 @@ public void testPostIncrementOptimizations() { "private static class G {\n" + " private int x;\n" + " private static int y;\n" + - " private int[] a;\n" + " private static int[] b;\n" + + " static {\n" + + " G.b = new int[] { 1 };\n" + + " }\n" + " private G() {\n" + - " this.a = new int[] { 0 };\n" + " }\n" + + " private int[] a = { 1 };\n" + " public int f() {\n" + " return this.x++;\n" + " }\n" + @@ -269,9 +271,6 @@ public void testPostIncrementOptimizations() { " public int h(int n) {\n" + " return (++this.x + this.a[n++]) / (this.a[++n] + ++this.a[n]) * ++G.b[++G.y];\n" + " }\n" + - " static {\n" + - " G.b = new int[] { 0 };\n" + - " }\n" + "}\n" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java index d1e208de..a7d69da4 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java @@ -43,6 +43,13 @@ public void testFloatingPointPrecision() throws Throwable { " static double x;\n" + " static double y;\n" + " static float z;\n" + + " static {\n" + + " A.d = 2.7182818459;\n" + + " A.w = Double.POSITIVE_INFINITY;\n" + + " A.x = Double.NEGATIVE_INFINITY;\n" + + " A.y = -4.9E-324;\n" + + " A.z = Float.MIN_VALUE;\n" + + " }\n" + " public static strictfp void test() {\n" + " final double t = 9.007199254740992E15;\n" + " final double x = t * t;\n" + @@ -57,13 +64,6 @@ public void testFloatingPointPrecision() throws Throwable { " System.out.println(A.z);\n" + " System.out.println((double)A.z);\n" + " }\n" + - " static {\n" + - " A.d = 2.7182818459;\n" + - " A.w = Double.POSITIVE_INFINITY;\n" + - " A.x = Double.NEGATIVE_INFINITY;\n" + - " A.y = -4.9E-324;\n" + - " A.z = Float.MIN_VALUE;\n" + - " }\n" + "}" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java new file mode 100644 index 00000000..012a9b30 --- /dev/null +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java @@ -0,0 +1,239 @@ +package com.strobel.decompiler; + +import org.junit.Test; + +public class RealignTest extends DecompilerTest { + + static class Test1 { + + public void method1() { + System.out.println("Test.method1"); + } + + public void method2() { + System.out.println("Test.method2"); + } + + class Inner1 { + + public Inner1() { + System.out.println("Inner1 constructor"); + } + + public void method1() { + System.out.println("Inner1.method1"); + } + + public void method2() { + System.out.println("Inner1.method2"); + } + } + + class Inner2 { + + public Inner2() { + System.out.println("Inner2 constructor"); + } + } + + + public void method3() { + System.out.println("Test.method3"); + } + + public void method4() { + System.out.println("Test.method4"); + } + + class Inner3 { + + public Inner3() { + System.out.println("Inner3 constructor"); + } + + public void method1() { + System.out.println("Inner3.method1"); + } + + public void method2() { + System.out.println("Inner3.method2"); + } + } + + class Inner4 { + + public Inner4() { + System.out.println("Inner4 constructor"); + } + + public void method1() { + System.out.println("Inner4.method1"); + } + + public void method2() { + System.out.println("Inner4.method2"); + } + } + + public void method5() { + System.out.println("Test.method5"); + } + + public void method6() { + System.out.println("Test.method6"); + } + } + + static class Test2 { + + private Test2 top = new Test2(0); + private Test2 test; + + static { + System.out.println("clinit1"); + } + + public Test2(int i) { + System.out.println(i); + } + + private Test2 middle = new Test2(false); + + public Test2(boolean flag) { + System.out.println(flag); + test = new Test2(0); + } + + static { + System.out.println("clinit2"); + } + + private Test2 bottom = new Test2(true); + + static { + System.out.println("clinit3"); + } + } + + @Test + public void testReOrderMembers() throws Throwable { + verifyOutput( + Test1.class, + lineNumberSettings(), + "static class Test1 {\n" + + " public void method1() {\n" + + " System.out.println(/*EL:10*/\"Test.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:14*/\"Test.method2\");\n" + + " }\n" + + " \n" + + " class Inner1 {\n" + + " public Inner1() {\n" + + " System.out.println(/*EL:20*/\"Inner1 constructor\");\n" + + " }\n" + + " \n" + + " public void method1() {\n" + + " System.out.println(/*EL:24*/\"Inner1.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:28*/\"Inner1.method2\");\n" + + " }\n" + + " }\n" + + " \n" + + " class Inner2 {\n" + + " public Inner2() {\n" + + " System.out.println(/*EL:35*/\"Inner2 constructor\");\n" + + " }\n" + + " }\n" + + " \n" + + " public void method3() {\n" + + " System.out.println(/*EL:41*/\"Test.method3\");\n" + + " }\n" + + " \n" + + " public void method4() {\n" + + " System.out.println(/*EL:45*/\"Test.method4\");\n" + + " }\n" + + " \n" + + " class Inner3 {\n" + + " public Inner3() {\n" + + " System.out.println(/*EL:51*/\"Inner3 constructor\");\n" + + " }\n" + + " \n" + + " public void method1() {\n" + + " System.out.println(/*EL:55*/\"Inner3.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:59*/\"Inner3.method2\");\n" + + " }\n" + + " }\n" + + " \n" + + " class Inner4 {\n" + + " public Inner4() {\n" + + " System.out.println(/*EL:66*/\"Inner4 constructor\");\n" + + " }\n" + + " \n" + + " public void method1() {\n" + + " System.out.println(/*EL:70*/\"Inner4.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:74*/\"Inner4.method2\");\n" + + " }\n" + + " }\n" + + " \n" + + " public void method5() {\n" + + " System.out.println(/*EL:79*/\"Test.method5\");\n" + + " }\n" + + " \n" + + " public void method6() {\n" + + " System.out.println(/*EL:83*/\"Test.method6\");\n" + + " }\n" + + "}" + ); + } + + + @Test + public void testRewriteInit() throws Throwable { + verifyOutput( + Test2.class, + lineNumberSettings(), + "static class Test2 {\n" + + " /*SL:89*/private Test2 top = new Test2(0);\n" + + " static {\n" + + " System.out.println(/*EL:93*/\"clinit1\");\n" + + " }\n" + + " \n" + + " public Test2(final int i) {\n" + + " System.out.println(/*EL:97*/i);\n" + + " }\n" + + " \n" + + " /*SL:100*/private Test2 middle = new Test2(false);\n" + + " \n" + + " public Test2(final boolean flag) {\n" + + " System.out.println(/*EL:103*/flag);\n" + + " /*SL:104*/this.test = new Test2(0);\n" + + " }\n" + + " \n" + + " private Test2 test;\n" + + " static {\n" + + " System.out.println(/*EL:108*/\"clinit2\");\n" + + " }\n" + + " /*SL:111*/private Test2 bottom = new Test2(true);\n" + + " static {\n" + + " System.out.println(/*EL:114*/\"clinit3\");\n" + + " }\n" + + "}" + ); + } + + private static DecompilerSettings lineNumberSettings() { + DecompilerSettings lineNumberSettings = defaultSettings(); + lineNumberSettings.setShowDebugLineNumbers(true); + return lineNumberSettings; + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 93eef23b..abf5c9b3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ #Sun Oct 27 14:39:59 EDT 2019 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists From 051f8b1d28714419d91ec8d477e83ef0b36df7b4 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Mon, 6 Jun 2022 20:07:29 +0200 Subject: [PATCH 16/58] revert gradle to 6.9 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index abf5c9b3..93eef23b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ #Sun Oct 27 14:39:59 EDT 2019 -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists From 7d63946fb027fe06f81f66e91eaf50a41bc8072c Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Mon, 6 Jun 2022 22:32:07 +0200 Subject: [PATCH 17/58] fix regressions --- .../languages/java/ast/MethodDeclaration.java | 14 +++++++++----- .../RewriteInitForLineStretchTransform.java | 12 +++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java index 8be93db5..c81ac700 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java @@ -25,10 +25,10 @@ import com.strobel.decompiler.patterns.Role; public class MethodDeclaration extends EntityDeclaration { - public final static Role DEFAULT_VALUE_ROLE = new Role<>("DefaultValue", Expression.class, Expression.NULL); + public static final Role DEFAULT_VALUE_ROLE = new Role<>("DefaultValue", Expression.class, Expression.NULL); - public final static TokenRole DEFAULT_KEYWORD = new TokenRole("default", TokenRole.FLAG_KEYWORD); - public final static TokenRole THROWS_KEYWORD = new TokenRole("throws", TokenRole.FLAG_KEYWORD); + public static final TokenRole DEFAULT_KEYWORD = new TokenRole("default", TokenRole.FLAG_KEYWORD); + public static final TokenRole THROWS_KEYWORD = new TokenRole("throws", TokenRole.FLAG_KEYWORD); private int firstKnownLineNumber; @@ -114,9 +114,13 @@ public boolean matches(final INode other, final Match match) { return false; } + public boolean isFirstLineNumberKnown() { + return firstKnownLineNumber > 0; + } + @Override public int getFirstKnownLineNumber() { - if (firstKnownLineNumber > 0) { + if (isFirstLineNumberKnown()) { return firstKnownLineNumber; } return super.getFirstKnownLineNumber(); @@ -132,7 +136,7 @@ public static MethodDeclaration forPattern(final Pattern pattern) { return new MethodDeclaration.PatternPlaceholder(VerifyArgument.notNull(pattern, "pattern")); } - private final static class PatternPlaceholder extends MethodDeclaration { + private static final class PatternPlaceholder extends MethodDeclaration { final Pattern child; PatternPlaceholder(final Pattern child) { diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index d2407c99..fcc7347a 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -22,11 +22,11 @@ import com.strobel.assembler.metadata.FieldDefinition; import com.strobel.assembler.metadata.MemberReference; import com.strobel.assembler.metadata.MethodDefinition; -import com.strobel.assembler.metadata.ParameterDefinition; import com.strobel.decompiler.DecompilerContext; import com.strobel.decompiler.languages.java.LineNumberTableConverter; import com.strobel.decompiler.languages.java.MinMaxLineNumberVisitor; import com.strobel.decompiler.languages.java.ast.AssignmentExpression; +import com.strobel.decompiler.languages.java.ast.AssignmentOperatorType; import com.strobel.decompiler.languages.java.ast.AstNode; import com.strobel.decompiler.languages.java.ast.BlockStatement; import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; @@ -71,6 +71,9 @@ public Void visitBlockStatement(BlockStatement node, Void data) { MinMaxLineNumberVisitor minMaxLineNumberVisitor = new MinMaxLineNumberVisitor(lineNumberTableConverter); child.acceptVisitor(minMaxLineNumberVisitor, null); int currentLineNumber = minMaxLineNumberVisitor.getMinLineNumber(); + if (!methodDeclaration.isFirstLineNumberKnown()) { + methodDeclaration.setFirstKnownLineNumber(currentLineNumber); + } if (previousLineNumber > 0 && currentLineNumber > previousLineNumber + 3) { newMethodDeclaration = (MethodDeclaration) methodDeclaration.clone(); newMethodDeclaration.setFirstKnownLineNumber(currentLineNumber); @@ -113,8 +116,11 @@ public Void visitBlockStatement(BlockStatement node, Void data) { @Override public Void visitAssignmentExpression(AssignmentExpression node, Void data) { AstNode parent = node.getParent(); - if (parent instanceof ExpressionStatement && parent.getParent() instanceof BlockStatement && parent.getParent().getParent() instanceof ConstructorDeclaration - && node.getLeft() instanceof MemberReferenceExpression) { + if (parent instanceof ExpressionStatement + && parent.getParent() instanceof BlockStatement + && parent.getParent().getParent() instanceof ConstructorDeclaration + && node.getLeft() instanceof MemberReferenceExpression + && node.getOperator() == AssignmentOperatorType.ASSIGN) { ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration) parent.getParent().getParent(); MethodDefinition constructor = constructorDeclaration.getUserData(Keys.METHOD_DEFINITION); final LineNumberTableAttribute lineNumberTable = SourceAttribute.find(AttributeNames.LineNumberTable, From ca11cbc3f123667885f2fad330bbf11ec865d368 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 8 Jun 2022 21:44:27 +0200 Subject: [PATCH 18/58] move static block initializations to declarations where possible --- .../RewriteInitForLineStretchTransform.java | 72 +++++++++++-------- .../com/strobel/decompiler/EncodingTests.java | 5 +- .../com/strobel/decompiler/NameTests.java | 5 +- .../com/strobel/decompiler/OperatorTests.java | 5 +- .../strobel/decompiler/PrimitiveTests.java | 17 ++--- 5 files changed, 51 insertions(+), 53 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index fcc7347a..60c9c007 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -31,6 +31,7 @@ import com.strobel.decompiler.languages.java.ast.BlockStatement; import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; +import com.strobel.decompiler.languages.java.ast.EntityDeclaration; import com.strobel.decompiler.languages.java.ast.Expression; import com.strobel.decompiler.languages.java.ast.ExpressionStatement; import com.strobel.decompiler.languages.java.ast.FieldDeclaration; @@ -41,7 +42,6 @@ import com.strobel.decompiler.languages.java.ast.VariableInitializer; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -118,27 +118,29 @@ public Void visitAssignmentExpression(AssignmentExpression node, Void data) { AstNode parent = node.getParent(); if (parent instanceof ExpressionStatement && parent.getParent() instanceof BlockStatement - && parent.getParent().getParent() instanceof ConstructorDeclaration + && parent.getParent().getParent() instanceof EntityDeclaration && node.getLeft() instanceof MemberReferenceExpression && node.getOperator() == AssignmentOperatorType.ASSIGN) { - ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration) parent.getParent().getParent(); - MethodDefinition constructor = constructorDeclaration.getUserData(Keys.METHOD_DEFINITION); - final LineNumberTableAttribute lineNumberTable = SourceAttribute.find(AttributeNames.LineNumberTable, - constructor != null ? constructor.getSourceAttributes() : Collections.emptyList()); - LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTable); - MemberReferenceExpression memberReferenceExpression = (MemberReferenceExpression) node.getFirstChild(); - MemberReference memberReference = memberReferenceExpression.getUserData(Keys.MEMBER_REFERENCE); - FieldInit fieldInit = fieldDeclarations.get(memberReference.getFullName()); - if (fieldInit != null && (constructor == null || !constructor.hasParameter(memberReference.getName()))) { - Expression initializer = node.getRight(); - int fieldInitLineNo = lineNumberTableConverter.getLineForOffset(initializer.getOffset()); - if (fieldInitLineNo > 0) { - FieldDeclaration fieldDeclaration = fieldInit.declaration; - int fieldDeclLineNo = fieldDeclaration.getLineNumber(); - if (fieldInitLineNo == fieldDeclLineNo || (fieldInit.initializers.isEmpty() && fieldDeclLineNo == 0)) { - fieldDeclaration.setLineNumber(fieldInitLineNo); - fieldInit.initializers.add(initializer); - fieldInit.statements.add((ExpressionStatement) node.getParent()); + EntityDeclaration entityDeclaration = (EntityDeclaration) parent.getParent().getParent(); + MethodDefinition methodDefinition = entityDeclaration.getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null && (methodDefinition.isConstructor() || methodDefinition.isTypeInitializer())) { + LineNumberTableAttribute lineNumberTable = SourceAttribute.find(AttributeNames.LineNumberTable, methodDefinition.getSourceAttributes()); + LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTable); + MemberReferenceExpression memberReferenceExpression = (MemberReferenceExpression) node.getFirstChild(); + MemberReference memberReference = memberReferenceExpression.getUserData(Keys.MEMBER_REFERENCE); + FieldInit fieldInit = fieldDeclarations.get(memberReference.getFullName()); + if (fieldInit != null && !methodDefinition.hasParameter(memberReference.getName())) { + Expression initializer = node.getRight(); + int fieldInitLineNo = lineNumberTableConverter.getLineForOffset(initializer.getOffset()); + if (fieldInitLineNo > 0) { + FieldDeclaration fieldDeclaration = fieldInit.declaration; + int fieldDeclLineNo = fieldDeclaration.getLineNumber(); + if (fieldInitLineNo == fieldDeclLineNo || (fieldInit.initializers.isEmpty() && fieldDeclLineNo == 0)) { + fieldDeclaration.setLineNumber(fieldInitLineNo); + fieldInit.initializers.add(initializer); + fieldInit.statements.add((ExpressionStatement) node.getParent()); + fieldInit.initMethod = methodDefinition; + } } } } @@ -164,31 +166,35 @@ public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { @Override public void run(AstNode compilationUnit) { super.run(compilationUnit); - if (constructorCount > 0) { - for (FieldInit fieldInit : fieldDeclarations.values()) { - if (fieldInit.initializers.size() == constructorCount) { - fieldInit.removeInitializers(); - fieldInit.removeStatements(); - fieldInit.declaration.getVariables().clear(); - fieldInit.declaration.getVariables().add(new VariableInitializer(fieldInit.declaration.getName(), fieldInit.initializers.get(0))); - } + for (FieldInit fieldInit : fieldDeclarations.values()) { + if (fieldInit.isInAllConstructors() || fieldInit.isInStaticBlock()) { + fieldInit.removeInitializers(); + fieldInit.removeStatements(); + fieldInit.declaration.getVariables().clear(); + fieldInit.declaration.getVariables().add(new VariableInitializer(fieldInit.declaration.getName(), fieldInit.initializers.get(0))); } } } - private static class FieldInit { + private class FieldInit { private final FieldDeclaration declaration; private final List initializers = new ArrayList<>(); private final List statements = new ArrayList<>(); + private MethodDefinition initMethod; public FieldInit(FieldDeclaration declaration) { this.declaration = declaration; } public void removeStatements() { + AstNode parent = null; for (ExpressionStatement expressionStatement : statements) { + parent = expressionStatement.getParent(); expressionStatement.remove(); } + if (isInStaticBlock() && parent != null && !parent.hasChildren() && parent.getParent() instanceof MethodDeclaration) { + parent.getParent().remove(); + } } public void removeInitializers() { @@ -196,5 +202,13 @@ public void removeInitializers() { initializer.remove(); } } + + public boolean isInAllConstructors() { + return initMethod != null && initMethod.isConstructor() && constructorCount > 0 && initializers.size() == constructorCount; + } + + public boolean isInStaticBlock() { + return initMethod != null && initMethod.isTypeInitializer(); + } } } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java index f0f7d80f..c99b7ea2 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java @@ -61,7 +61,6 @@ public void testUnicodeIdentifierEscaping() { A.class, defaultSettings(), "private static final class A {\n" + - " static String \\ufe4f\\u2167;\n" + " static final transient short x\\u03a7x = 5;\n" + " private static String __\\u0130\\u00dfI(final A x) {\n" + " return A.\\ufe4f\\u2167;\n" + @@ -70,9 +69,7 @@ public void testUnicodeIdentifierEscaping() { " System.out.println(__\\u0130\\u00dfI(null));\n" + " System.out.println(\"\\\"\\u0000\\u000fu\\\\\\\"\\ff'\\rr'\\nn \\u0123\\u1234O\\uffffF\");\n" + " }\n" + - " static {\n" + - " A.\\ufe4f\\u2167 = \"\\ufeff\\ud800\\ud8d8\\udffd\";\n" + - " }\n" + + " static String \\ufe4f\\u2167 = \"\\ufeff\\ud800\\ud8d8\\udffd\";\n" + "}" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java index 9640e53f..2f4e73d2 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java @@ -196,10 +196,7 @@ public void testFieldHidesImportedTypeName() throws Throwable { C.class, defaultSettings(), "static final class C {\n" + - " static float Float;\n" + - " static {\n" + - " C.Float = java.lang.Float.NaN;\n" + - " }\n" + + " static float Float = java.lang.Float.NaN;\n" + " void f() {\n" + " System.out.println(C.Float);\n" + " System.out.println(java.lang.Float.NaN);\n" + diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java index f24770e6..fd85b9db 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java @@ -255,10 +255,7 @@ public void testPostIncrementOptimizations() { "private static class G {\n" + " private int x;\n" + " private static int y;\n" + - " private static int[] b;\n" + - " static {\n" + - " G.b = new int[] { 1 };\n" + - " }\n" + + " private static int[] b = { 1 };\n" + " private G() {\n" + " }\n" + " private int[] a = { 1 };\n" + diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java index a7d69da4..a3c6c5aa 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java @@ -38,18 +38,11 @@ public void testFloatingPointPrecision() throws Throwable { defaultSettings(), "private static final class A {\n" + " static final float e = 2.7182817f;\n" + - " static double d;\n" + - " static double w;\n" + - " static double x;\n" + - " static double y;\n" + - " static float z;\n" + - " static {\n" + - " A.d = 2.7182818459;\n" + - " A.w = Double.POSITIVE_INFINITY;\n" + - " A.x = Double.NEGATIVE_INFINITY;\n" + - " A.y = -4.9E-324;\n" + - " A.z = Float.MIN_VALUE;\n" + - " }\n" + + " static double d = 2.7182818459;\n" + + " static double w = Double.POSITIVE_INFINITY;\n" + + " static double x = Double.NEGATIVE_INFINITY;\n" + + " static double y = -4.9E-324;\n" + + " static float z = Float.MIN_VALUE;\n" + " public static strictfp void test() {\n" + " final double t = 9.007199254740992E15;\n" + " final double x = t * t;\n" + From 8ba2a8f29b8925c59d066dafb7b012de4a446f60 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 8 Jun 2022 22:31:29 +0200 Subject: [PATCH 19/58] Create gradle-tests.yml --- .github/workflows/gradle-tests.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/gradle-tests.yml diff --git a/.github/workflows/gradle-tests.yml b/.github/workflows/gradle-tests.yml new file mode 100644 index 00000000..79a6e761 --- /dev/null +++ b/.github/workflows/gradle-tests.yml @@ -0,0 +1,17 @@ +name: Run Gradle on PRs +on: pull_request +jobs: + gradle: + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + java-version: 8 + - name: Setup and execute Gradle 'test' task + uses: gradle/gradle-build-action@v2 + with: + arguments: test From 9a993150be6390f602561533ec7c0b2cd4908001 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 8 Jun 2022 22:37:03 +0200 Subject: [PATCH 20/58] Update gradle-tests.yml --- .github/workflows/gradle-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/gradle-tests.yml b/.github/workflows/gradle-tests.yml index 79a6e761..a99b28c8 100644 --- a/.github/workflows/gradle-tests.yml +++ b/.github/workflows/gradle-tests.yml @@ -11,6 +11,7 @@ jobs: - uses: actions/setup-java@v3 with: java-version: 8 + distribution: 'temurin' - name: Setup and execute Gradle 'test' task uses: gradle/gradle-build-action@v2 with: From ef9c28fa6dca41d74e6fc1ed278e99cc61972e63 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 08:52:15 +0200 Subject: [PATCH 21/58] refactoring RewriteInitForLineStretchTransform --- .../RewriteInitForLineStretchTransform.java | 131 ++++++++++++------ 1 file changed, 85 insertions(+), 46 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index 60c9c007..b3884dfc 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -42,13 +42,14 @@ import com.strobel.decompiler.languages.java.ast.VariableInitializer; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; public class RewriteInitForLineStretchTransform extends ContextTrackingVisitor { - private Map fieldDeclarations = new HashMap<>(); + private ConcurrentHashMap fieldDeclarations = new ConcurrentHashMap<>(); + private ConcurrentHashMap fieldInitLocations = new ConcurrentHashMap<>(); private int constructorCount; public RewriteInitForLineStretchTransform(DecompilerContext context) { @@ -116,11 +117,8 @@ public Void visitBlockStatement(BlockStatement node, Void data) { @Override public Void visitAssignmentExpression(AssignmentExpression node, Void data) { AstNode parent = node.getParent(); - if (parent instanceof ExpressionStatement - && parent.getParent() instanceof BlockStatement - && parent.getParent().getParent() instanceof EntityDeclaration - && node.getLeft() instanceof MemberReferenceExpression - && node.getOperator() == AssignmentOperatorType.ASSIGN) { + if (parent instanceof ExpressionStatement && parent.getParent() instanceof BlockStatement && parent.getParent().getParent() instanceof EntityDeclaration + && node.getLeft() instanceof MemberReferenceExpression && node.getOperator() == AssignmentOperatorType.ASSIGN) { EntityDeclaration entityDeclaration = (EntityDeclaration) parent.getParent().getParent(); MethodDefinition methodDefinition = entityDeclaration.getUserData(Keys.METHOD_DEFINITION); if (methodDefinition != null && (methodDefinition.isConstructor() || methodDefinition.isTypeInitializer())) { @@ -128,20 +126,15 @@ public Void visitAssignmentExpression(AssignmentExpression node, Void data) { LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTable); MemberReferenceExpression memberReferenceExpression = (MemberReferenceExpression) node.getFirstChild(); MemberReference memberReference = memberReferenceExpression.getUserData(Keys.MEMBER_REFERENCE); - FieldInit fieldInit = fieldDeclarations.get(memberReference.getFullName()); - if (fieldInit != null && !methodDefinition.hasParameter(memberReference.getName())) { - Expression initializer = node.getRight(); - int fieldInitLineNo = lineNumberTableConverter.getLineForOffset(initializer.getOffset()); - if (fieldInitLineNo > 0) { - FieldDeclaration fieldDeclaration = fieldInit.declaration; - int fieldDeclLineNo = fieldDeclaration.getLineNumber(); - if (fieldInitLineNo == fieldDeclLineNo || (fieldInit.initializers.isEmpty() && fieldDeclLineNo == 0)) { - fieldDeclaration.setLineNumber(fieldInitLineNo); - fieldInit.initializers.add(initializer); - fieldInit.statements.add((ExpressionStatement) node.getParent()); - fieldInit.initMethod = methodDefinition; - } - } + FieldDeclaration fieldDeclaration = fieldDeclarations.get(memberReference.getFullName()); + Expression initializer = node.getRight(); + int offset = initializer.getOffset(); + int lineNumber = lineNumberTableConverter.getLineForOffset(offset); + if (lineNumber > 0 && fieldDeclaration != null && !methodDefinition.hasParameter(memberReference.getName())) { + fieldDeclaration.setLineNumber(lineNumber); + FieldLocation fieldLocation = new FieldLocation(memberReference.getFullName(), offset); + fieldInitLocations.putIfAbsent(fieldLocation, new FieldInit(fieldDeclaration)); + fieldInitLocations.get(fieldLocation).init(initializer, (ExpressionStatement) node.getParent(), methodDefinition); } } } @@ -152,7 +145,7 @@ public Void visitAssignmentExpression(AssignmentExpression node, Void data) { public Void visitFieldDeclaration(FieldDeclaration node, Void data) { FieldDefinition fieldDefinition = node.getUserData(Keys.FIELD_DEFINITION); if (fieldDefinition != null) { - fieldDeclarations.put(fieldDefinition.getFullName(), new FieldInit(node)); + fieldDeclarations.put(fieldDefinition.getFullName(), node); } return super.visitFieldDeclaration(node, data); } @@ -166,49 +159,95 @@ public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { @Override public void run(AstNode compilationUnit) { super.run(compilationUnit); - for (FieldInit fieldInit : fieldDeclarations.values()) { - if (fieldInit.isInAllConstructors() || fieldInit.isInStaticBlock()) { - fieldInit.removeInitializers(); - fieldInit.removeStatements(); - fieldInit.declaration.getVariables().clear(); - fieldInit.declaration.getVariables().add(new VariableInitializer(fieldInit.declaration.getName(), fieldInit.initializers.get(0))); + for (FieldInit fieldInit : fieldInitLocations.values()) { + if (fieldInit.isInAllConstructors() || fieldInit.isInTypeInitializer()) { + fieldInit.removeFieldInitStatements(); + fieldInit.createVariableInitializer(); } } } private class FieldInit { private final FieldDeclaration declaration; - private final List initializers = new ArrayList<>(); - private final List statements = new ArrayList<>(); - private MethodDefinition initMethod; + private final List fieldInitStatements = new ArrayList<>(); + private boolean inConstructor = true; + private boolean inTypeInitializer = true; public FieldInit(FieldDeclaration declaration) { this.declaration = declaration; } - public void removeStatements() { + public void init(Expression initializer, ExpressionStatement expressionStatement, MethodDefinition initMethod) { + inConstructor &= initMethod != null && initMethod.isConstructor(); + inTypeInitializer &= initMethod != null && initMethod.isTypeInitializer(); + fieldInitStatements.add(new FieldInitStatement(initializer, expressionStatement)); + } + + public void removeFieldInitStatements() { AstNode parent = null; - for (ExpressionStatement expressionStatement : statements) { - parent = expressionStatement.getParent(); - expressionStatement.remove(); + for (FieldInitStatement fieldInitStatement : fieldInitStatements) { + parent = fieldInitStatement.statement.getParent(); + fieldInitStatement.remove(); } - if (isInStaticBlock() && parent != null && !parent.hasChildren() && parent.getParent() instanceof MethodDeclaration) { + if (isInTypeInitializer() && parent != null && !parent.hasChildren() && parent.getParent() instanceof MethodDeclaration) { parent.getParent().remove(); } } - public void removeInitializers() { - for (Expression initializer : initializers) { - initializer.remove(); - } - } - public boolean isInAllConstructors() { - return initMethod != null && initMethod.isConstructor() && constructorCount > 0 && initializers.size() == constructorCount; + return inConstructor && constructorCount > 0 && fieldInitStatements.size() == constructorCount; } - public boolean isInStaticBlock() { - return initMethod != null && initMethod.isTypeInitializer(); + public boolean isInTypeInitializer() { + return inTypeInitializer; } + + public void createVariableInitializer() { + declaration.getVariables().clear(); + declaration.getVariables().add(new VariableInitializer(declaration.getName(), fieldInitStatements.get(0).initializer)); + } + } + + private static class FieldInitStatement { + private final Expression initializer; + private final ExpressionStatement statement; + + public FieldInitStatement(Expression initializer, ExpressionStatement statement) { + this.initializer = initializer; + this.statement = statement; + } + + public void remove() { + initializer.remove(); + statement.remove(); + } + } + + private static class FieldLocation { + private final String fieldName; + private final int fieldOffset; + + public FieldLocation(String fieldName, int fieldOffset) { + this.fieldName = fieldName; + this.fieldOffset = fieldOffset; + } + + @Override + public int hashCode() { + return Objects.hash(fieldName, fieldOffset); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + FieldLocation other = (FieldLocation) obj; + return Objects.equals(fieldName, other.fieldName) && fieldOffset == other.fieldOffset; + } + } } From 2312d2a366c0a807c5ff51d2a8e6b8a71758765b Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 09:02:41 +0200 Subject: [PATCH 22/58] reformat RewriteInitForLineStretchTransform --- .../ast/transforms/RewriteInitForLineStretchTransform.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index b3884dfc..d109c51e 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -117,8 +117,11 @@ public Void visitBlockStatement(BlockStatement node, Void data) { @Override public Void visitAssignmentExpression(AssignmentExpression node, Void data) { AstNode parent = node.getParent(); - if (parent instanceof ExpressionStatement && parent.getParent() instanceof BlockStatement && parent.getParent().getParent() instanceof EntityDeclaration - && node.getLeft() instanceof MemberReferenceExpression && node.getOperator() == AssignmentOperatorType.ASSIGN) { + if (parent instanceof ExpressionStatement + && parent.getParent() instanceof BlockStatement + && parent.getParent().getParent() instanceof EntityDeclaration + && node.getLeft() instanceof MemberReferenceExpression + && node.getOperator() == AssignmentOperatorType.ASSIGN) { EntityDeclaration entityDeclaration = (EntityDeclaration) parent.getParent().getParent(); MethodDefinition methodDefinition = entityDeclaration.getUserData(Keys.METHOD_DEFINITION); if (methodDefinition != null && (methodDefinition.isConstructor() || methodDefinition.isTypeInitializer())) { From 372a8cefeaee4ba794827862c4f7f5c3d799a28b Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 10:19:34 +0200 Subject: [PATCH 23/58] added all sources to fat jar --- build.gradle | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 99377a22..db18f324 100644 --- a/build.gradle +++ b/build.gradle @@ -80,11 +80,6 @@ subprojects { from 'build/docs/javadoc' } - task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource - } - tasks.withType(Test) { testLogging { // set options for log level LIFECYCLE @@ -122,6 +117,14 @@ subprojects { } if (project.name == "Procyon.Decompiler") { + + task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource + from project(':Procyon.Core').collect { it.sourceSets.main.allSource } + from project(':Procyon.CompilerTools').collect { it.sourceSets.main.allSource } + } + artifacts { archives jar archives javadocJar @@ -129,6 +132,11 @@ subprojects { } } else { + task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource + } + javadoc { options.encoding = 'UTF-8' } From 0d26e55211ac97b70ed175bc31711a028ecc6b21 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 12:09:05 +0200 Subject: [PATCH 24/58] handled new case and added new unit test for this(...) call --- .../assembler/metadata/MethodDefinition.java | 18 ++--- .../RewriteInitForLineStretchTransform.java | 48 +++++++++++-- .../com/strobel/decompiler/RealignTest.java | 67 ++++++++++++++++++- 3 files changed, 117 insertions(+), 16 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java index c4a5d223..74e52a9e 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java @@ -219,15 +219,17 @@ public int hashCode() { @Override public boolean equals(final Object obj) { - if (obj instanceof MethodDefinition) { - final MethodDefinition other = (MethodDefinition) obj; - - return StringUtilities.equals(getName(), other.getName()) && - StringUtilities.equals(getErasedSignature(), other.getErasedSignature()) && - typeNamesMatch(getDeclaringType(), other.getDeclaringType()); + if (obj == this) { + return true; + } + if (obj == null || obj.getClass() != getClass()) { + return false; } + final MethodDefinition other = (MethodDefinition) obj; - return false; + return StringUtilities.equals(getName(), other.getName()) && + StringUtilities.equals(getErasedSignature(), other.getErasedSignature()) && + typeNamesMatch(getDeclaringType(), other.getDeclaringType()); } @Override @@ -236,7 +238,7 @@ public void invalidateSignature() { _erasedSignature = null; } - private boolean typeNamesMatch(final TypeReference t1, final TypeReference t2) { + private static boolean typeNamesMatch(final TypeReference t1, final TypeReference t2) { return t1 != null && t2 != null && StringUtilities.equals(t1.getFullName(), t2.getFullName()); diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index d109c51e..b29e203b 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -35,10 +35,12 @@ import com.strobel.decompiler.languages.java.ast.Expression; import com.strobel.decompiler.languages.java.ast.ExpressionStatement; import com.strobel.decompiler.languages.java.ast.FieldDeclaration; +import com.strobel.decompiler.languages.java.ast.InvocationExpression; import com.strobel.decompiler.languages.java.ast.Keys; import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; import com.strobel.decompiler.languages.java.ast.MethodDeclaration; import com.strobel.decompiler.languages.java.ast.Roles; +import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; import com.strobel.decompiler.languages.java.ast.VariableInitializer; import java.util.ArrayList; @@ -50,8 +52,8 @@ public class RewriteInitForLineStretchTransform extends ContextTrackingVisitor fieldDeclarations = new ConcurrentHashMap<>(); private ConcurrentHashMap fieldInitLocations = new ConcurrentHashMap<>(); - private int constructorCount; - + private ConcurrentHashMap constructionDefinitionToDeclaration = new ConcurrentHashMap<>(); + public RewriteInitForLineStretchTransform(DecompilerContext context) { super(context); } @@ -154,13 +156,30 @@ public Void visitFieldDeclaration(FieldDeclaration node, Void data) { } @Override - public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { - constructorCount++; - return super.visitConstructorDeclaration(node, p); + public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data) { + if (node.getParent() instanceof InvocationExpression) { + MemberReference memberReference = node.getParent().getUserData(Keys.MEMBER_REFERENCE); + if (memberReference instanceof MethodDefinition) { + MethodDefinition methodDefinition = (MethodDefinition) memberReference; + ConstructorDeclaration constructorDeclaration = constructionDefinitionToDeclaration.get(methodDefinition); + if (constructorDeclaration != null) { + MethodDefinition currentMethodDefinition = context.getCurrentMethod(); + try { + context.setCurrentMethod(null); + visitConstructorDeclaration(constructorDeclaration, data); + } + finally { + context.setCurrentMethod(currentMethodDefinition); + } + } + } + } + return super.visitThisReferenceExpression(node, data); } - + @Override public void run(AstNode compilationUnit) { + new ConstructorGatherer(context).run(compilationUnit); super.run(compilationUnit); for (FieldInit fieldInit : fieldInitLocations.values()) { if (fieldInit.isInAllConstructors() || fieldInit.isInTypeInitializer()) { @@ -198,7 +217,7 @@ public void removeFieldInitStatements() { } public boolean isInAllConstructors() { - return inConstructor && constructorCount > 0 && fieldInitStatements.size() == constructorCount; + return inConstructor && !constructionDefinitionToDeclaration.isEmpty() && fieldInitStatements.size() == constructionDefinitionToDeclaration.size(); } public boolean isInTypeInitializer() { @@ -251,6 +270,21 @@ public boolean equals(Object obj) { FieldLocation other = (FieldLocation) obj; return Objects.equals(fieldName, other.fieldName) && fieldOffset == other.fieldOffset; } + } + + private class ConstructorGatherer extends ContextTrackingVisitor { + protected ConstructorGatherer(DecompilerContext context) { + super(context); + } + + @Override + public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { + MethodDefinition methodDefinition = node.getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null) { + constructionDefinitionToDeclaration.put(methodDefinition, node); + } + return super.visitConstructorDeclaration(node, p); + } } } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java index 012a9b30..31eea034 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java @@ -101,7 +101,7 @@ public Test2(int i) { public Test2(boolean flag) { System.out.println(flag); - test = new Test2(0); + test = new Test2(0); // must not be moved to declaration } static { @@ -115,6 +115,38 @@ public Test2(boolean flag) { } } + static class Test3 { + + private Test3 top = new Test3(0); + private Test3 test; + + static { + System.out.println("clinit1"); + } + + public Test3(int i) { + this(false); + System.out.println(i); + } + + private Test3 middle = new Test3(false); + + public Test3(boolean flag) { + System.out.println(flag); + test = new Test3(0); // can be moved to declaration (because of this(...) call) + } + + static { + System.out.println("clinit2"); + } + + private Test3 bottom = new Test3(true); + + static { + System.out.println("clinit3"); + } + } + @Test public void testReOrderMembers() throws Throwable { verifyOutput( @@ -231,6 +263,39 @@ public void testRewriteInit() throws Throwable { ); } + @Test + public void testRewriteInit2() throws Throwable { + verifyOutput( + Test3.class, + lineNumberSettings(), + "static class Test3 {\n" + + " /*SL:120*/private Test3 top = new Test3(0);\n" + + " static {\n" + + " System.out.println(/*EL:124*/\"clinit1\");\n" + + " }\n" + + " \n" + + " public Test3(final int i) {\n" + + " /*SL:128*/this(false);\n" + + " System.out.println(/*EL:129*/i);\n" + + " }\n" + + " \n" + + " /*SL:132*/private Test3 middle = new Test3(false);\n" + + " \n" + + " public Test3(final boolean flag) {\n" + + " System.out.println(/*EL:135*/flag);\n" + + " }\n" + + " /*SL:136*/private Test3 test = new Test3(0);\n" + + " static {\n" + + " System.out.println(/*EL:140*/\"clinit2\");\n" + + " }\n" + + " /*SL:143*/private Test3 bottom = new Test3(true);\n" + + " static {\n" + + " System.out.println(/*EL:146*/\"clinit3\");\n" + + " }\n" + + "}" + ); + } + private static DecompilerSettings lineNumberSettings() { DecompilerSettings lineNumberSettings = defaultSettings(); lineNumberSettings.setShowDebugLineNumbers(true); From c64b5c5390279d8fa388d64437149fa533b6a5b6 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 13:51:35 +0200 Subject: [PATCH 25/58] fix: count only constructors of declaring type --- .../RewriteInitForLineStretchTransform.java | 17 +++- .../com/strobel/decompiler/RealignTest.java | 83 +++++++++++-------- 2 files changed, 63 insertions(+), 37 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index b29e203b..c3240cd8 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -22,6 +22,7 @@ import com.strobel.assembler.metadata.FieldDefinition; import com.strobel.assembler.metadata.MemberReference; import com.strobel.assembler.metadata.MethodDefinition; +import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.decompiler.DecompilerContext; import com.strobel.decompiler.languages.java.LineNumberTableConverter; import com.strobel.decompiler.languages.java.MinMaxLineNumberVisitor; @@ -217,7 +218,21 @@ public void removeFieldInitStatements() { } public boolean isInAllConstructors() { - return inConstructor && !constructionDefinitionToDeclaration.isEmpty() && fieldInitStatements.size() == constructionDefinitionToDeclaration.size(); + int constructorCount = countConstructors(); + return inConstructor && constructorCount > 0 && fieldInitStatements.size() == constructorCount; + } + + private int countConstructors() { + int constructorCount = 0; + FieldDefinition fieldDefinition = declaration.getUserData(Keys.FIELD_DEFINITION); + if (fieldDefinition != null) { + for (MethodDefinition methodDefinition : constructionDefinitionToDeclaration.keySet()) { + if (methodDefinition.getDeclaringType() == fieldDefinition.getDeclaringType()) { + constructorCount++; + } + } + } + return constructorCount; } public boolean isInTypeInitializer() { diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java index 31eea034..cbf95f54 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java @@ -4,7 +4,7 @@ public class RealignTest extends DecompilerTest { - static class Test1 { + static class ReOrderMembers { public void method1() { System.out.println("Test.method1"); @@ -84,75 +84,81 @@ public void method6() { } } - static class Test2 { + static class RewriteInit { - private Test2 top = new Test2(0); - private Test2 test; + private RewriteInit top = new RewriteInit(0); + private RewriteInit test; static { System.out.println("clinit1"); } - public Test2(int i) { + public RewriteInit(int i) { System.out.println(i); } - private Test2 middle = new Test2(false); + private RewriteInit middle = new RewriteInit(false); - public Test2(boolean flag) { + public RewriteInit(boolean flag) { System.out.println(flag); - test = new Test2(0); // must not be moved to declaration + test = new RewriteInit(0); // must not be moved to declaration } static { System.out.println("clinit2"); } - private Test2 bottom = new Test2(true); + private RewriteInit bottom = new RewriteInit(true); static { System.out.println("clinit3"); } } - static class Test3 { + static class RewriteInit2 { - private Test3 top = new Test3(0); - private Test3 test; + private RewriteInit2 top = new RewriteInit2(0); + private RewriteInit2 test; static { System.out.println("clinit1"); } - public Test3(int i) { + public RewriteInit2(int i) { this(false); System.out.println(i); } - private Test3 middle = new Test3(false); + private RewriteInit2 middle = new RewriteInit2(false); - public Test3(boolean flag) { + public RewriteInit2(boolean flag) { System.out.println(flag); - test = new Test3(0); // can be moved to declaration (because of this(...) call) + test = new RewriteInit2(0); // can be moved to declaration (because of this(...) call) } static { System.out.println("clinit2"); } - private Test3 bottom = new Test3(true); + private RewriteInit2 bottom = new RewriteInit2(true); static { System.out.println("clinit3"); } + + class Inner { + Inner() { + System.out.println("Inner"); + } + } } @Test public void testReOrderMembers() throws Throwable { verifyOutput( - Test1.class, + ReOrderMembers.class, lineNumberSettings(), - "static class Test1 {\n" + + "static class ReOrderMembers {\n" + " public void method1() {\n" + " System.out.println(/*EL:10*/\"Test.method1\");\n" + " }\n" + @@ -232,30 +238,30 @@ public void testReOrderMembers() throws Throwable { @Test public void testRewriteInit() throws Throwable { verifyOutput( - Test2.class, + RewriteInit.class, lineNumberSettings(), - "static class Test2 {\n" + - " /*SL:89*/private Test2 top = new Test2(0);\n" + + "static class RewriteInit {\n" + + " /*SL:89*/private RewriteInit top = new RewriteInit(0);\n" + " static {\n" + " System.out.println(/*EL:93*/\"clinit1\");\n" + " }\n" + " \n" + - " public Test2(final int i) {\n" + + " public RewriteInit(final int i) {\n" + " System.out.println(/*EL:97*/i);\n" + " }\n" + " \n" + - " /*SL:100*/private Test2 middle = new Test2(false);\n" + + " /*SL:100*/private RewriteInit middle = new RewriteInit(false);\n" + " \n" + - " public Test2(final boolean flag) {\n" + + " public RewriteInit(final boolean flag) {\n" + " System.out.println(/*EL:103*/flag);\n" + - " /*SL:104*/this.test = new Test2(0);\n" + + " /*SL:104*/this.test = new RewriteInit(0);\n" + " }\n" + " \n" + - " private Test2 test;\n" + + " private RewriteInit test;\n" + " static {\n" + " System.out.println(/*EL:108*/\"clinit2\");\n" + " }\n" + - " /*SL:111*/private Test2 bottom = new Test2(true);\n" + + " /*SL:111*/private RewriteInit bottom = new RewriteInit(true);\n" + " static {\n" + " System.out.println(/*EL:114*/\"clinit3\");\n" + " }\n" + @@ -266,32 +272,37 @@ public void testRewriteInit() throws Throwable { @Test public void testRewriteInit2() throws Throwable { verifyOutput( - Test3.class, + RewriteInit2.class, lineNumberSettings(), - "static class Test3 {\n" + - " /*SL:120*/private Test3 top = new Test3(0);\n" + + "static class RewriteInit2 {\n" + + " /*SL:120*/private RewriteInit2 top = new RewriteInit2(0);\n" + " static {\n" + " System.out.println(/*EL:124*/\"clinit1\");\n" + " }\n" + " \n" + - " public Test3(final int i) {\n" + + " public RewriteInit2(final int i) {\n" + " /*SL:128*/this(false);\n" + " System.out.println(/*EL:129*/i);\n" + " }\n" + " \n" + - " /*SL:132*/private Test3 middle = new Test3(false);\n" + + " /*SL:132*/private RewriteInit2 middle = new RewriteInit2(false);\n" + " \n" + - " public Test3(final boolean flag) {\n" + + " public RewriteInit2(final boolean flag) {\n" + " System.out.println(/*EL:135*/flag);\n" + " }\n" + - " /*SL:136*/private Test3 test = new Test3(0);\n" + + " /*SL:136*/private RewriteInit2 test = new RewriteInit2(0);\n" + " static {\n" + " System.out.println(/*EL:140*/\"clinit2\");\n" + " }\n" + - " /*SL:143*/private Test3 bottom = new Test3(true);\n" + + " /*SL:143*/private RewriteInit2 bottom = new RewriteInit2(true);\n" + " static {\n" + " System.out.println(/*EL:146*/\"clinit3\");\n" + " }\n" + + " class Inner {\n" + + " Inner() {\n" + + " System.out.println(/*EL:151*/\"Inner\");\n" + + " }\n" + + " }\n" + "}" ); } From d6edb2acbb920dba8722f74dfa133c7f39050f29 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 13:59:11 +0200 Subject: [PATCH 26/58] removed unused import --- .../java/ast/transforms/RewriteInitForLineStretchTransform.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index c3240cd8..d6c6c96e 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -22,7 +22,6 @@ import com.strobel.assembler.metadata.FieldDefinition; import com.strobel.assembler.metadata.MemberReference; import com.strobel.assembler.metadata.MethodDefinition; -import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.decompiler.DecompilerContext; import com.strobel.decompiler.languages.java.LineNumberTableConverter; import com.strobel.decompiler.languages.java.MinMaxLineNumberVisitor; From 05ee91462717362b57e47c4f522166b223280dc4 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 16:32:55 +0200 Subject: [PATCH 27/58] new case & unit test: check use of local variables in field initializers --- .../RewriteInitForLineStretchTransform.java | 65 ++++++++++++------- .../transforms/TransformationPipeline.java | 2 +- .../com/strobel/decompiler/RealignTest.java | 29 +++++++++ 3 files changed, 71 insertions(+), 25 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index d6c6c96e..75b43a05 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -18,6 +18,8 @@ import com.strobel.assembler.ir.attributes.AttributeNames; import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; +import com.strobel.assembler.ir.attributes.LocalVariableTableAttribute; +import com.strobel.assembler.ir.attributes.LocalVariableTableEntry; import com.strobel.assembler.ir.attributes.SourceAttribute; import com.strobel.assembler.metadata.FieldDefinition; import com.strobel.assembler.metadata.MemberReference; @@ -29,12 +31,15 @@ import com.strobel.decompiler.languages.java.ast.AssignmentOperatorType; import com.strobel.decompiler.languages.java.ast.AstNode; import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.CompilationUnit; import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; +import com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor; import com.strobel.decompiler.languages.java.ast.EntityDeclaration; import com.strobel.decompiler.languages.java.ast.Expression; import com.strobel.decompiler.languages.java.ast.ExpressionStatement; import com.strobel.decompiler.languages.java.ast.FieldDeclaration; +import com.strobel.decompiler.languages.java.ast.Identifier; import com.strobel.decompiler.languages.java.ast.InvocationExpression; import com.strobel.decompiler.languages.java.ast.Keys; import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; @@ -44,20 +49,18 @@ import com.strobel.decompiler.languages.java.ast.VariableInitializer; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -public class RewriteInitForLineStretchTransform extends ContextTrackingVisitor { +public class RewriteInitForLineStretchTransform extends DepthFirstAstVisitor implements IAstTransform { private ConcurrentHashMap fieldDeclarations = new ConcurrentHashMap<>(); private ConcurrentHashMap fieldInitLocations = new ConcurrentHashMap<>(); private ConcurrentHashMap constructionDefinitionToDeclaration = new ConcurrentHashMap<>(); - public RewriteInitForLineStretchTransform(DecompilerContext context) { - super(context); - } - @Override public Void visitBlockStatement(BlockStatement node, Void data) { if (node.getParent() instanceof MethodDeclaration) { @@ -136,10 +139,15 @@ public Void visitAssignmentExpression(AssignmentExpression node, Void data) { int offset = initializer.getOffset(); int lineNumber = lineNumberTableConverter.getLineForOffset(offset); if (lineNumber > 0 && fieldDeclaration != null && !methodDefinition.hasParameter(memberReference.getName())) { - fieldDeclaration.setLineNumber(lineNumber); - FieldLocation fieldLocation = new FieldLocation(memberReference.getFullName(), offset); - fieldInitLocations.putIfAbsent(fieldLocation, new FieldInit(fieldDeclaration)); - fieldInitLocations.get(fieldLocation).init(initializer, (ExpressionStatement) node.getParent(), methodDefinition); + LocalVariableTableAttribute localVariableTable = SourceAttribute.find(AttributeNames.LocalVariableTable, methodDefinition.getSourceAttributes()); + IdentifierGatherer identifierGatherer = new IdentifierGatherer(); + initializer.acceptVisitor(identifierGatherer, null); + if (localVariableTable == null || identifierGatherer.containsNoneOf(localVariableTable.getEntries())) { + fieldDeclaration.setLineNumber(lineNumber); + FieldLocation fieldLocation = new FieldLocation(memberReference.getFullName(), offset); + fieldInitLocations.putIfAbsent(fieldLocation, new FieldInit(fieldDeclaration)); + fieldInitLocations.get(fieldLocation).init(initializer, (ExpressionStatement) node.getParent(), methodDefinition); + } } } } @@ -163,14 +171,7 @@ public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data MethodDefinition methodDefinition = (MethodDefinition) memberReference; ConstructorDeclaration constructorDeclaration = constructionDefinitionToDeclaration.get(methodDefinition); if (constructorDeclaration != null) { - MethodDefinition currentMethodDefinition = context.getCurrentMethod(); - try { - context.setCurrentMethod(null); - visitConstructorDeclaration(constructorDeclaration, data); - } - finally { - context.setCurrentMethod(currentMethodDefinition); - } + visitConstructorDeclaration(constructorDeclaration, data); } } } @@ -179,8 +180,8 @@ public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data @Override public void run(AstNode compilationUnit) { - new ConstructorGatherer(context).run(compilationUnit); - super.run(compilationUnit); + compilationUnit.acceptVisitor(new ConstructorGatherer(), null); + compilationUnit.acceptVisitor(this, null); for (FieldInit fieldInit : fieldInitLocations.values()) { if (fieldInit.isInAllConstructors() || fieldInit.isInTypeInitializer()) { fieldInit.removeFieldInitStatements(); @@ -286,12 +287,8 @@ public boolean equals(Object obj) { } } - private class ConstructorGatherer extends ContextTrackingVisitor { + private class ConstructorGatherer extends DepthFirstAstVisitor { - protected ConstructorGatherer(DecompilerContext context) { - super(context); - } - @Override public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { MethodDefinition methodDefinition = node.getUserData(Keys.METHOD_DEFINITION); @@ -301,4 +298,24 @@ public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { return super.visitConstructorDeclaration(node, p); } } + + private static class IdentifierGatherer extends DepthFirstAstVisitor { + + private Set identifiers = new HashSet<>(); + + public boolean containsNoneOf(List entries) { + for (LocalVariableTableEntry entry : entries) { + if (identifiers.contains(entry.getName())) { + return false; + } + } + return true; + } + + @Override + public Void visitIdentifier(Identifier node, Void data) { + identifiers.add(node.getName()); + return super.visitIdentifier(node, data); + } + } } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java index 3750c7b1..1dd36a86 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java @@ -77,7 +77,7 @@ public static IAstTransform[] createPipeline(final DecompilerContext context) { new AddReferenceQualifiersTransform(context), new RemoveHiddenMembersTransform(context), new CollapseImportsTransform(context), - new RewriteInitForLineStretchTransform(context), + new RewriteInitForLineStretchTransform(), new ReOrderMembersForLineStretchTransform(context) }; } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java index cbf95f54..52c6863e 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java @@ -153,6 +153,18 @@ class Inner { } } + static class RewriteInit3 { + + private int _a, _b; + + public RewriteInit3(int a) { + _a = a; + double b = Math.random(); + _b = b < 0.5 ? 1 : 0; + } + } + + @Test public void testReOrderMembers() throws Throwable { verifyOutput( @@ -307,6 +319,23 @@ public void testRewriteInit2() throws Throwable { ); } + @Test + public void testRewriteInit3() throws Throwable { + verifyOutput( + RewriteInit3.class, + lineNumberSettings(), + "static class RewriteInit3 {\n" + + " private int _a;\n" + + " private int _b;\n" + + " public RewriteInit3(final int a) {\n" + + " /*SL:161*/this._a = a;\n" + + " final double b = /*EL:162*/Math.random();\n" + + " /*SL:163*/this._b = ((b < 0.5) ? 1 : 0);\n" + + " }\n" + + "}" + ); + } + private static DecompilerSettings lineNumberSettings() { DecompilerSettings lineNumberSettings = defaultSettings(); lineNumberSettings.setShowDebugLineNumbers(true); From e70abf91fd3dce893d19a5403f5fdf969b5c766f Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 12 Jun 2022 19:09:02 +0200 Subject: [PATCH 28/58] removed unused imports --- .../ast/transforms/RewriteInitForLineStretchTransform.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index 75b43a05..de99b4b3 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -24,16 +24,13 @@ import com.strobel.assembler.metadata.FieldDefinition; import com.strobel.assembler.metadata.MemberReference; import com.strobel.assembler.metadata.MethodDefinition; -import com.strobel.decompiler.DecompilerContext; import com.strobel.decompiler.languages.java.LineNumberTableConverter; import com.strobel.decompiler.languages.java.MinMaxLineNumberVisitor; import com.strobel.decompiler.languages.java.ast.AssignmentExpression; import com.strobel.decompiler.languages.java.ast.AssignmentOperatorType; import com.strobel.decompiler.languages.java.ast.AstNode; import com.strobel.decompiler.languages.java.ast.BlockStatement; -import com.strobel.decompiler.languages.java.ast.CompilationUnit; import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; -import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; import com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor; import com.strobel.decompiler.languages.java.ast.EntityDeclaration; import com.strobel.decompiler.languages.java.ast.Expression; From b2344da409f2e480437774a3fbc7d8e9843c47d3 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 20:21:40 +0100 Subject: [PATCH 29/58] add coverage with jacoco/codecov --- .github/workflows/coverage.yml | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/coverage.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000..e55eed25 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,37 @@ +name: Coverage + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +permissions: + contents: read + +jobs: + test-and-coverage: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: "8" + cache: gradle + + - name: Ensure Gradle wrapper is executable + run: chmod +x ./gradlew + + - name: Run tests and generate merged JaCoCo report + run: ./gradlew --no-daemon clean test jacocoRootReport + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 + with: + files: "build/reports/jacoco/jacocoRootReport/jacocoRootReport.xml" + fail_ci_if_error: true From ae55d75b93e9b986779939fde359e839f116aa6c Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 20:23:03 +0100 Subject: [PATCH 30/58] added jacoco to build.gradle --- build.gradle | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/build.gradle b/build.gradle index 550c0a4f..aeb80a99 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,11 @@ allprojects { apply plugin: 'java' apply plugin: 'idea' apply plugin: 'maven' + apply plugin: 'jacoco' + + jacoco { + toolVersion = '0.8.12' + } buildDir = rootDir.canonicalPath + "/build/" + rootProject.relativePath(projectDir.canonicalPath) @@ -119,6 +124,17 @@ subprojects { } } } + + finalizedBy jacocoTestReport + } + + jacocoTestReport { + dependsOn test + reports { + xml.enabled true + html.enabled true + csv.enabled false + } } if (project.name == "Procyon.Decompiler") { @@ -218,3 +234,65 @@ subprojects { } } } + +def getProjectList() { + // These projects are considered. Replace with a different list as needed. + subprojects + project +} + +task jacocoMerge(type: JacocoMerge) { + group = LifecycleBasePlugin.VERIFICATION_GROUP + description = 'Merge the JaCoCo data files from all subprojects into one' + project.afterEvaluate { // do it at the end of the config phase to be sure all information is present + FileCollection execFiles = project.objects.fileCollection() // an empty FileCollection + getProjectList().each { Project subproject -> + if (subproject.pluginManager.hasPlugin('jacoco')) { + def testTasks = subproject.tasks.withType(Test) + dependsOn(testTasks) // ensure that .exec files are actually present + + testTasks.each { Test task -> + // The JacocoTaskExtension is the source of truth for the location of the .exec file. + JacocoTaskExtension extension = task.getExtensions().findByType(JacocoTaskExtension.class); + if (extension != null) { + execFiles.from extension.getDestinationFile() + } + } + } + } + executionData = execFiles + } + doFirst { + // .exec files might be missing if a project has no tests. Filter in execution phase. + executionData = executionData.filter { it.canRead() } + } +} + +def getReportTasks(JacocoReport pRootTask) { + getProjectList().collect { + it.tasks.withType(JacocoReport).findAll { it != pRootTask } + }.flatten() +} + +task jacocoRootReport(type: JacocoReport, dependsOn: tasks.jacocoMerge) { + group = LifecycleBasePlugin.VERIFICATION_GROUP + description = 'Generates an aggregate report from all subprojects' + + logger.lifecycle 'Using aggregated file: ' + tasks.jacocoMerge.destinationFile + executionData.from tasks.jacocoMerge.destinationFile + + project.afterEvaluate { + // The JacocoReport tasks are the source of truth for class files and sources. + def reportTasks = getReportTasks(tasks.jacocoRootReport) + classDirectories.from project.files({ + reportTasks.collect {it.classDirectories}.findAll {it != null} + }) + sourceDirectories.from project.files({ + reportTasks.collect {it.sourceDirectories}.findAll {it != null} + }) + } + + reports { + xml.enabled = true + html.enabled = true + } +} \ No newline at end of file From 86dfe7a508234bdbbdd6a24e3de68732e8319953 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 20:32:49 +0100 Subject: [PATCH 31/58] Update Gradle CI workflow to run tests and JaCoCo report --- .github/workflows/gradle-tests.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/gradle-tests.yml b/.github/workflows/gradle-tests.yml index a99b28c8..12ade0cc 100644 --- a/.github/workflows/gradle-tests.yml +++ b/.github/workflows/gradle-tests.yml @@ -12,7 +12,9 @@ jobs: with: java-version: 8 distribution: 'temurin' - - name: Setup and execute Gradle 'test' task - uses: gradle/gradle-build-action@v2 - with: - arguments: test + + - name: Ensure Gradle wrapper is executable + run: chmod +x ./gradlew + + - name: Run tests and generate merged JaCoCo report + run: ./gradlew --no-daemon clean test jacocoRootReport From 860b1caa9cd71152b44c42780a8c8b70a9f47669 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 20:35:33 +0100 Subject: [PATCH 32/58] Update README.md with codecov badge --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 70d0e11d..02b24040 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Coverage Status](https://codecov.io/gh/nbauma109/procyon/branch/master/graph/badge.svg)](https://app.codecov.io/gh/nbauma109/procyon) + ![](https://mstrobel.github.io/procyon/procyon.png) *Procyon* is a suite of Java metaprogramming tools focused on code generation and analysis. It includes the following libraries: @@ -131,3 +133,4 @@ Check out these third party products based on Procyon! Are you using Procyon in A JavaFX-based decompiler front-end with fast and convenient code navigation. Download it, or launch it directly from your browser. - [Bytecode Viewer](https://github.com/Konloch/bytecode-viewer) is an open source Java decompilation, disassembly, and debugging suite by [@Konloch](https://twitter.com/Konloch). It can produce decompiled sources from several modern Java decompilers, including Procyon, CFR, and FernFlower. + From 9570f28b6ad628f6fd21ea72abb89f0e6824865d Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 20:37:12 +0100 Subject: [PATCH 33/58] Update README with new jitpack badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 02b24040..f9285316 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![](https://jitpack.io/v/nbauma109/procyon.svg)](https://jitpack.io/#nbauma109/procyon) [![Coverage Status](https://codecov.io/gh/nbauma109/procyon/branch/master/graph/badge.svg)](https://app.codecov.io/gh/nbauma109/procyon) ![](https://mstrobel.github.io/procyon/procyon.png) @@ -134,3 +135,4 @@ Check out these third party products based on Procyon! Are you using Procyon in - [Bytecode Viewer](https://github.com/Konloch/bytecode-viewer) is an open source Java decompilation, disassembly, and debugging suite by [@Konloch](https://twitter.com/Konloch). It can produce decompiled sources from several modern Java decompilers, including Procyon, CFR, and FernFlower. + From 3718c408da2586d79c5269305be6a7cfe943e738 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 21:13:34 +0100 Subject: [PATCH 34/58] Configure Dependabot for Maven and GitHub Actions Updated Dependabot configuration to include Maven and GitHub Actions with daily update schedules. --- .github/dependabot.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..68bf759a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "maven" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" + time: "17:00" + timezone: "Europe/Paris" + - package-ecosystem: "github-actions" + directory: "/" # Location of GitHub Actions workflows + schedule: + interval: "daily" + time: "17:00" + timezone: "Europe/Paris" From d7d8bedfdfb98500c5c8eb0faf8db4001ab02035 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 21:32:19 +0100 Subject: [PATCH 35/58] Delete .github/workflows/gradle-tests.yml --- .github/workflows/gradle-tests.yml | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .github/workflows/gradle-tests.yml diff --git a/.github/workflows/gradle-tests.yml b/.github/workflows/gradle-tests.yml deleted file mode 100644 index 12ade0cc..00000000 --- a/.github/workflows/gradle-tests.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Run Gradle on PRs -on: pull_request -jobs: - gradle: - strategy: - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - java-version: 8 - distribution: 'temurin' - - - name: Ensure Gradle wrapper is executable - run: chmod +x ./gradlew - - - name: Run tests and generate merged JaCoCo report - run: ./gradlew --no-daemon clean test jacocoRootReport From e7a7c2af9bc3d670540c63aa9f306542c170863e Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Tue, 23 Dec 2025 21:33:07 +0100 Subject: [PATCH 36/58] Update GitHub Actions to use latest versions --- .github/workflows/gradle-wrapper-validation.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index 3a8f311e..c7c435ce 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -6,6 +6,6 @@ jobs: name: "Validation" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: gradle/wrapper-validation-action@v1.0.3 + - uses: actions/checkout@v6 + - uses: gradle/wrapper-validation-action@v3.5.0 From 9e64e8edc5585b76dd720a4c7b8e1856b7a164de Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 24 Dec 2025 17:38:33 +0100 Subject: [PATCH 37/58] Document reasons for forking Procyon project Added section explaining the rationale behind forking the Procyon project, detailing issues with maintenance and communication. --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index f9285316..70ffa010 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ [![](https://jitpack.io/v/nbauma109/procyon.svg)](https://jitpack.io/#nbauma109/procyon) [![Coverage Status](https://codecov.io/gh/nbauma109/procyon/branch/master/graph/badge.svg)](https://app.codecov.io/gh/nbauma109/procyon) +### Why a fork ? + + * I haven't been able to get my multiple pull requests merged for years + * Original project hasn't been maintained for years + * I haven't been able to get in touch by e-mail with Mike Strobel + * I need this fork for line number realignment to work properly in Eclipse Enhanced Decompiler plugin ([ECD](https://github.com/nbauma109/ecd)) + ![](https://mstrobel.github.io/procyon/procyon.png) *Procyon* is a suite of Java metaprogramming tools focused on code generation and analysis. It includes the following libraries: @@ -136,3 +143,4 @@ Check out these third party products based on Procyon! Are you using Procyon in - [Bytecode Viewer](https://github.com/Konloch/bytecode-viewer) is an open source Java decompilation, disassembly, and debugging suite by [@Konloch](https://twitter.com/Konloch). It can produce decompiled sources from several modern Java decompilers, including Procyon, CFR, and FernFlower. + From e839b343679943e77b9de37118ab623d7ce04876 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 24 Dec 2025 17:45:19 +0100 Subject: [PATCH 38/58] Update README with fork rationale and pull requests Added details about the fork and additional pull requests. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 70ffa010..2f648119 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### Why a fork ? - * I haven't been able to get my multiple pull requests merged for years + * I haven't been able to get my multiple pull requests merged for years (#52, #53, #55, #59, #60) * Original project hasn't been maintained for years * I haven't been able to get in touch by e-mail with Mike Strobel * I need this fork for line number realignment to work properly in Eclipse Enhanced Decompiler plugin ([ECD](https://github.com/nbauma109/ecd)) @@ -144,3 +144,4 @@ Check out these third party products based on Procyon! Are you using Procyon in + From 6b9d5972ef2e0dae2a794bec2495a92066b0bc24 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Wed, 24 Dec 2025 17:50:58 +0100 Subject: [PATCH 39/58] Update README with additional links and formatting --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f648119..18b3ce0e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### Why a fork ? - * I haven't been able to get my multiple pull requests merged for years (#52, #53, #55, #59, #60) + * I haven't been able to get my multiple pull requests merged for years ([#52](https://github.com/mstrobel/procyon/pull/52), [#53](https://github.com/mstrobel/procyon/pull/53), [#55](https://github.com/mstrobel/procyon/pull/55), [#59](https://github.com/mstrobel/procyon/pull/59), [#60](https://github.com/mstrobel/procyon/pull/60)) * Original project hasn't been maintained for years * I haven't been able to get in touch by e-mail with Mike Strobel * I need this fork for line number realignment to work properly in Eclipse Enhanced Decompiler plugin ([ECD](https://github.com/nbauma109/ecd)) @@ -145,3 +145,4 @@ Check out these third party products based on Procyon! Are you using Procyon in + From 43d6d3db18f967cf3d901790229035653437a2e4 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Fri, 26 Dec 2025 22:00:12 +0100 Subject: [PATCH 40/58] Update dependabot.yml --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 68bf759a..8d97a063 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,7 @@ version: 2 updates: - - package-ecosystem: "maven" # See documentation for possible values + - package-ecosystem: "gradle" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "daily" From 7a0066b5aea260dc365bc29de184fc57ad81ad81 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 28 Dec 2025 08:24:59 +0100 Subject: [PATCH 41/58] Update build.gradle to source compatibility 1.8 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 024d603d..e6a0d223 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ allprojects { version procyonVersion group 'com.github.mstrobel' - sourceCompatibility = 1.7 // JDK version + sourceCompatibility = 1.8 // JDK version repositories { mavenCentral() @@ -305,4 +305,4 @@ task jacocoRootReport(type: JacocoReport, dependsOn: tasks.jacocoMerge) { xml.enabled = true html.enabled = true } -} \ No newline at end of file +} From 561167f0f3b3491c00552f316ea92b27cfe36192 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Dec 2025 07:27:23 +0000 Subject: [PATCH 42/58] Bump com.beust:jcommander from 1.78 to 1.82 Bumps [com.beust:jcommander](https://github.com/cbeust/jcommander) from 1.78 to 1.82. - [Changelog](https://github.com/cbeust/jcommander/blob/master/CHANGELOG.md) - [Commits](https://github.com/cbeust/jcommander/compare/1.78...1.82) --- updated-dependencies: - dependency-name: com.beust:jcommander dependency-version: '1.82' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Procyon.Decompiler/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procyon.Decompiler/build.gradle b/Procyon.Decompiler/build.gradle index b81fa7fe..414375f7 100644 --- a/Procyon.Decompiler/build.gradle +++ b/Procyon.Decompiler/build.gradle @@ -11,7 +11,7 @@ jar { } dependencies { - compile 'com.beust:jcommander:1.78' + compile 'com.beust:jcommander:1.82' compile project(':Procyon.Core') compile project(':Procyon.CompilerTools') } From ed2b3dd3ff526663e2c6de613644e2d2e83b4506 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Thu, 1 Jan 2026 19:19:40 +0100 Subject: [PATCH 43/58] set version to 0.6.2-SNAPSHOT --- Procyon.Core/src/main/java/com/strobel/Procyon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procyon.Core/src/main/java/com/strobel/Procyon.java b/Procyon.Core/src/main/java/com/strobel/Procyon.java index bf393e30..7c06c76e 100644 --- a/Procyon.Core/src/main/java/com/strobel/Procyon.java +++ b/Procyon.Core/src/main/java/com/strobel/Procyon.java @@ -14,7 +14,7 @@ package com.strobel; public final class Procyon { - private static final String VERSION = "1.0-SNAPSHOT"; + private static final String VERSION = "0.6.2-SNAPSHOT"; public static String version() { return VERSION; From 8c078e425ad45aa9183ffa70c060296955926837 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 09:15:07 +0100 Subject: [PATCH 44/58] Fix negative offset issue --- .../RewriteInitForLineStretchTransform.java | 24 ++++++++++--------- .../com/strobel/decompiler/RealignTest.java | 11 ++++++++- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java index de99b4b3..734171e2 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -134,17 +134,19 @@ public Void visitAssignmentExpression(AssignmentExpression node, Void data) { FieldDeclaration fieldDeclaration = fieldDeclarations.get(memberReference.getFullName()); Expression initializer = node.getRight(); int offset = initializer.getOffset(); - int lineNumber = lineNumberTableConverter.getLineForOffset(offset); - if (lineNumber > 0 && fieldDeclaration != null && !methodDefinition.hasParameter(memberReference.getName())) { - LocalVariableTableAttribute localVariableTable = SourceAttribute.find(AttributeNames.LocalVariableTable, methodDefinition.getSourceAttributes()); - IdentifierGatherer identifierGatherer = new IdentifierGatherer(); - initializer.acceptVisitor(identifierGatherer, null); - if (localVariableTable == null || identifierGatherer.containsNoneOf(localVariableTable.getEntries())) { - fieldDeclaration.setLineNumber(lineNumber); - FieldLocation fieldLocation = new FieldLocation(memberReference.getFullName(), offset); - fieldInitLocations.putIfAbsent(fieldLocation, new FieldInit(fieldDeclaration)); - fieldInitLocations.get(fieldLocation).init(initializer, (ExpressionStatement) node.getParent(), methodDefinition); - } + if (offset != Expression.MYSTERY_OFFSET) { + int lineNumber = lineNumberTableConverter.getLineForOffset(offset); + if (lineNumber > 0 && fieldDeclaration != null && !methodDefinition.hasParameter(memberReference.getName())) { + LocalVariableTableAttribute localVariableTable = SourceAttribute.find(AttributeNames.LocalVariableTable, methodDefinition.getSourceAttributes()); + IdentifierGatherer identifierGatherer = new IdentifierGatherer(); + initializer.acceptVisitor(identifierGatherer, null); + if (localVariableTable == null || identifierGatherer.containsNoneOf(localVariableTable.getEntries())) { + fieldDeclaration.setLineNumber(lineNumber); + FieldLocation fieldLocation = new FieldLocation(memberReference.getFullName(), offset); + fieldInitLocations.putIfAbsent(fieldLocation, new FieldInit(fieldDeclaration)); + fieldInitLocations.get(fieldLocation).init(initializer, (ExpressionStatement) node.getParent(), methodDefinition); + } + } } } } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java index 52c6863e..99b7ec36 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java @@ -164,7 +164,7 @@ public RewriteInit3(int a) { } } - + @Test public void testReOrderMembers() throws Throwable { verifyOutput( @@ -336,6 +336,15 @@ public void testRewriteInit3() throws Throwable { ); } + @Test + public void testRewriteInitThrowable() throws Throwable { + verifyOutput( + "java/lang/Throwable", + lineNumberSettings(), + "public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; private transient Object backtrace; private static final StackTraceElement[] UNASSIGNED_STACK; private StackTraceElement[] stackTrace; private static final List SUPPRESSED_SENTINEL; private List suppressedExceptions; private static final String NULL_CAUSE_MESSAGE = \"Cannot suppress a null exception.\"; private static final String SELF_SUPPRESSION_MESSAGE = \"Self-suppression not permitted\"; private static final String CAUSE_CAPTION = \"Caused by: \"; private static final String SUPPRESSED_CAPTION = \"Suppressed: \"; private static final Throwable[] EMPTY_THROWABLE_ARRAY; private native Throwable fillInStackTrace(final int p0); native int getStackTraceDepth(); native StackTraceElement getStackTraceElement(final int p0); private abstract static class PrintStreamOrWriter { abstract Object lock(); abstract void println(final Object p0); } private static class SentinelHolder { public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL; public static final StackTraceElement[] STACK_TRACE_SENTINEL; static { /*SL:146*/STACK_TRACE_ELEMENT_SENTINEL = new StackTraceElement(\"\", \"\", null, Integer.MIN_VALUE); } static { /*SL:153*/STACK_TRACE_SENTINEL = new StackTraceElement[] { SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL }; } } static { /*SL:160*/UNASSIGNED_STACK = new StackTraceElement[0]; } static { /*SL:216*/SUPPRESSED_SENTINEL = Collections.unmodifiableList((List)new ArrayList(0)); } public Throwable() { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:251*/this.fillInStackTrace(); } public Throwable(final String detailMessage) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:266*/this.fillInStackTrace(); /*SL:267*/this.detailMessage = detailMessage; } public Throwable(final String detailMessage, final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:288*/this.fillInStackTrace(); /*SL:289*/this.detailMessage = detailMessage; /*SL:290*/this.cause = cause; } public Throwable(final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:311*/this.fillInStackTrace(); /*SL:312*/this.detailMessage = ((cause == null) ? null : cause.toString()); /*SL:313*/this.cause = cause; } protected Throwable(final String detailMessage, final Throwable cause, final boolean b, final boolean b2) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:360*/if (b2) { /*SL:361*/this.fillInStackTrace(); } else { /*SL:363*/this.stackTrace = null; } /*SL:365*/this.detailMessage = detailMessage; /*SL:366*/this.cause = cause; /*SL:367*/if (!b) { /*SL:368*/this.suppressedExceptions = null; } } private String detailMessage; /*SL:366*/private Throwable cause = this; public String getMessage() { /*SL:378*/return this.detailMessage; } public String getLocalizedMessage() { /*SL:392*/return this.getMessage(); } public synchronized Throwable getCause() { /*SL:416*/return (this.cause == this) ? null : this.cause; } public synchronized Throwable initCause(final Throwable cause) { /*SL:456*/if (this.cause != this) { /*SL:457*/throw new IllegalStateException(\"Can't overwrite cause with \" + /*EL:458*/Objects.toString(cause, \"a null\"), this); } /*SL:459*/if (cause == this) { /*SL:460*/throw new IllegalArgumentException(\"Self-causation not permitted\", this); } /*SL:461*/this.cause = cause; /*SL:462*/return this; } @Override public String toString() { final String name = /*EL:480*/this.getClass().getName(); final String localizedMessage = /*EL:481*/this.getLocalizedMessage(); /*SL:482*/return (localizedMessage != null) ? (name + \": \" + localizedMessage) : name; } public void printStackTrace() { /*SL:635*/this.printStackTrace(System.err); } public void printStackTrace(final PrintStream printStream) { /*SL:644*/this.printStackTrace(new WrappedPrintStream(printStream)); } private void printStackTrace(final PrintStreamOrWriter printStreamOrWriter) { final Set setFromMap = /*EL:651*/Collections.newSetFromMap(new IdentityHashMap()); /*SL:652*/setFromMap.add(this); /*SL:654*/synchronized (printStreamOrWriter.lock()) { /*SL:656*/printStreamOrWriter.println(this); final StackTraceElement[] ourStackTrace; final StackTraceElement[] array = /*EL:658*/ourStackTrace = this.getOurStackTrace(); for (int length = ourStackTrace.length, i = 0; i < length; ++i) { /*SL:659*/printStreamOrWriter.println(\"\\tat \" + ourStackTrace[i]); } final Throwable[] suppressed = /*EL:662*/this.getSuppressed(); for (int length2 = suppressed.length, j = 0; j < length2; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:663*/printStreamOrWriter, array, \"Suppressed: \", \"\\t\", setFromMap); } final Throwable cause = /*EL:666*/this.getCause(); /*SL:667*/if (cause != null) { /*SL:668*/cause.printEnclosedStackTrace(printStreamOrWriter, array, \"Caused by: \", \"\", setFromMap); } } } private void printEnclosedStackTrace(final PrintStreamOrWriter printStreamOrWriter, final StackTraceElement[] array, final String s, final String s2, final Set set) { /*SL:681*/assert Thread.holdsLock(printStreamOrWriter.lock()); /*SL:682*/if (set.contains(this)) { /*SL:683*/printStreamOrWriter.println(\"\\t[CIRCULAR REFERENCE:\" + this + \"]\"); } else { /*SL:685*/set.add(this); final StackTraceElement[] ourStackTrace = /*EL:687*/this.getOurStackTrace(); int n = /*EL:688*/ourStackTrace.length - 1; /*SL:690*/for (int n2 = array.length - 1; n >= 0 && n2 >= 0 && ourStackTrace[n].equals(array[n2]); /*SL:691*/--n, --n2) {} final int n3 = /*EL:693*/ourStackTrace.length - 1 - n; /*SL:696*/printStreamOrWriter.println(s2 + s + this); /*SL:697*/for (int i = 0; i <= n; ++i) { /*SL:698*/printStreamOrWriter.println(s2 + \"\\tat \" + ourStackTrace[i]); } /*SL:699*/if (n3 != 0) { /*SL:700*/printStreamOrWriter.println(s2 + \"\\t... \" + n3 + \" more\"); } final Throwable[] suppressed = /*EL:703*/this.getSuppressed(); for (int length = suppressed.length, j = 0; j < length; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:704*/printStreamOrWriter, ourStackTrace, \"Suppressed: \", s2 + \"\\t\", set); } final Throwable cause = /*EL:708*/this.getCause(); /*SL:709*/if (cause != null) { /*SL:710*/cause.printEnclosedStackTrace(printStreamOrWriter, ourStackTrace, \"Caused by: \", s2, set); } } } public void printStackTrace(final PrintWriter printWriter) { /*SL:722*/this.printStackTrace(new WrappedPrintWriter(printWriter)); } private static class WrappedPrintStream extends PrintStreamOrWriter { /*SL:741*/private final PrintStream printStream = printStream; WrappedPrintStream(final PrintStream printStream) { } @Override Object lock() { /*SL:745*/return this.printStream; } @Override void println(final Object o) { /*SL:749*/this.printStream.println(o); } } private static class WrappedPrintWriter extends PrintStreamOrWriter { /*SL:757*/private final PrintWriter printWriter = printWriter; WrappedPrintWriter(final PrintWriter printWriter) { } @Override Object lock() { /*SL:761*/return this.printWriter; } @Override void println(final Object o) { /*SL:765*/this.printWriter.println(o); } } public synchronized Throwable fillInStackTrace() { /*SL:782*/if (this.stackTrace != null || this.backtrace != null) { /*SL:784*/this.fillInStackTrace(0); /*SL:785*/this.stackTrace = Throwable.UNASSIGNED_STACK; } /*SL:787*/return this; } public StackTraceElement[] getStackTrace() { /*SL:817*/return this.getOurStackTrace().clone(); } private synchronized StackTraceElement[] getOurStackTrace() { /*SL:823*/if (this.stackTrace == Throwable.UNASSIGNED_STACK || (this.stackTrace == null && this.backtrace != null)) { final int stackTraceDepth = /*EL:825*/this.getStackTraceDepth(); /*SL:826*/this.stackTrace = new StackTraceElement[stackTraceDepth]; /*SL:827*/for (int i = 0; i < stackTraceDepth; ++i) { /*SL:828*/this.stackTrace[i] = this.getStackTraceElement(i); } } else/*SL:829*/ if (this.stackTrace == null) { /*SL:830*/return Throwable.UNASSIGNED_STACK; } /*SL:832*/return this.stackTrace; } public void setStackTrace(final StackTraceElement[] array) { final StackTraceElement[] stackTrace = /*EL:865*/array.clone(); /*SL:866*/for (int i = 0; i < stackTrace.length; ++i) { /*SL:867*/if (stackTrace[i] == null) { /*SL:868*/throw new NullPointerException(\"stackTrace[\" + i + \"]\"); } } /*SL:871*/synchronized (this) { /*SL:872*/if (this.stackTrace == null && this.backtrace == null) { /*SL:874*/return; } /*SL:875*/this.stackTrace = stackTrace; } } private void readObject(final ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException { /*SL:915*/objectInputStream.defaultReadObject(); final List suppressedExceptions = /*EL:920*/this.suppressedExceptions; /*SL:921*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; final StackTraceElement[] stackTrace = /*EL:923*/this.stackTrace; /*SL:924*/this.stackTrace = Throwable.UNASSIGNED_STACK.clone(); /*SL:926*/if (suppressedExceptions != null) { final int validateSuppressedExceptionsList = /*EL:927*/this.validateSuppressedExceptionsList(suppressedExceptions); /*SL:928*/if (validateSuppressedExceptionsList > 0) { final ArrayList suppressedExceptions2 = /*EL:929*/new ArrayList(Math.min(100, validateSuppressedExceptionsList)); /*SL:931*/for (final Throwable t : suppressedExceptions) { /*SL:934*/if (t == null) { /*SL:935*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:936*/if (t == this) { /*SL:937*/throw new IllegalArgumentException(\"Self-suppression not permitted\"); } /*SL:938*/suppressedExceptions2.add((Object)t); } /*SL:942*/this.suppressedExceptions = (List)suppressedExceptions2; } } else { /*SL:945*/this.suppressedExceptions = null; } /*SL:957*/if (stackTrace != null) { final StackTraceElement[] stackTrace2 = /*EL:960*/stackTrace.clone(); /*SL:961*/if (stackTrace2.length >= 1) { /*SL:962*/if (stackTrace2.length == 1 && SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(stackTrace2[0])) { /*SL:965*/this.stackTrace = null; } else { final StackTraceElement[] array = /*EL:967*/stackTrace2; for (int length = array.length, i = 0; i < length; ++i) { /*SL:968*/if (array[i] == null) { /*SL:969*/throw new NullPointerException(\"null StackTraceElement in serial stream.\"); } } /*SL:971*/this.stackTrace = stackTrace2; } } } } private int validateSuppressedExceptionsList(final List list) throws IOException { boolean b; try { /*SL:988*/b = (list.getClass().getClassLoader() == null); } catch (final SecurityException ex) { /*SL:990*/b = false; } /*SL:993*/if (!b) { /*SL:994*/throw new StreamCorruptedException(\"List implementation class was not loaded by bootstrap class loader.\"); } final int size = /*EL:997*/list.size(); /*SL:998*/if (size < 0) { /*SL:999*/throw new StreamCorruptedException(\"Negative list size reported.\"); } /*SL:1001*/return size; } private synchronized void writeObject(final ObjectOutputStream objectOutputStream) throws IOException { /*SL:1018*/this.getOurStackTrace(); final StackTraceElement[] stackTrace = /*EL:1020*/this.stackTrace; try { /*SL:1022*/if (this.stackTrace == null) { /*SL:1023*/this.stackTrace = SentinelHolder.STACK_TRACE_SENTINEL; } /*SL:1024*/objectOutputStream.defaultWriteObject(); } finally { /*SL:1026*/this.stackTrace = stackTrace; } } public final synchronized void addSuppressed(final Throwable t) { /*SL:1081*/if (t == this) { /*SL:1082*/throw new IllegalArgumentException(\"Self-suppression not permitted\", t); } /*SL:1084*/if (t == null) { /*SL:1085*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:1087*/if (this.suppressedExceptions == null) { /*SL:1088*/return; } /*SL:1090*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL) { /*SL:1091*/this.suppressedExceptions = new ArrayList(1); } /*SL:1093*/this.suppressedExceptions.add(t); } static { /*SL:1096*/EMPTY_THROWABLE_ARRAY = new Throwable[0]; } public final synchronized Throwable[] getSuppressed() { /*SL:1114*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL || this.suppressedExceptions == null) { /*SL:1116*/return Throwable.EMPTY_THROWABLE_ARRAY; } /*SL:1118*/return this.suppressedExceptions.toArray(Throwable.EMPTY_THROWABLE_ARRAY); } }" + ); + } + private static DecompilerSettings lineNumberSettings() { DecompilerSettings lineNumberSettings = defaultSettings(); lineNumberSettings.setShowDebugLineNumbers(true); From ecd17c8ad405f7073ed21f870a07c99ed3a40713 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 10:02:46 +0100 Subject: [PATCH 45/58] update RealignTest --- .../src/test/java/com/strobel/decompiler/RealignTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java index 99b7ec36..9fe09bc9 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java @@ -341,7 +341,7 @@ public void testRewriteInitThrowable() throws Throwable { verifyOutput( "java/lang/Throwable", lineNumberSettings(), - "public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; private transient Object backtrace; private static final StackTraceElement[] UNASSIGNED_STACK; private StackTraceElement[] stackTrace; private static final List SUPPRESSED_SENTINEL; private List suppressedExceptions; private static final String NULL_CAUSE_MESSAGE = \"Cannot suppress a null exception.\"; private static final String SELF_SUPPRESSION_MESSAGE = \"Self-suppression not permitted\"; private static final String CAUSE_CAPTION = \"Caused by: \"; private static final String SUPPRESSED_CAPTION = \"Suppressed: \"; private static final Throwable[] EMPTY_THROWABLE_ARRAY; private native Throwable fillInStackTrace(final int p0); native int getStackTraceDepth(); native StackTraceElement getStackTraceElement(final int p0); private abstract static class PrintStreamOrWriter { abstract Object lock(); abstract void println(final Object p0); } private static class SentinelHolder { public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL; public static final StackTraceElement[] STACK_TRACE_SENTINEL; static { /*SL:146*/STACK_TRACE_ELEMENT_SENTINEL = new StackTraceElement(\"\", \"\", null, Integer.MIN_VALUE); } static { /*SL:153*/STACK_TRACE_SENTINEL = new StackTraceElement[] { SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL }; } } static { /*SL:160*/UNASSIGNED_STACK = new StackTraceElement[0]; } static { /*SL:216*/SUPPRESSED_SENTINEL = Collections.unmodifiableList((List)new ArrayList(0)); } public Throwable() { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:251*/this.fillInStackTrace(); } public Throwable(final String detailMessage) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:266*/this.fillInStackTrace(); /*SL:267*/this.detailMessage = detailMessage; } public Throwable(final String detailMessage, final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:288*/this.fillInStackTrace(); /*SL:289*/this.detailMessage = detailMessage; /*SL:290*/this.cause = cause; } public Throwable(final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:311*/this.fillInStackTrace(); /*SL:312*/this.detailMessage = ((cause == null) ? null : cause.toString()); /*SL:313*/this.cause = cause; } protected Throwable(final String detailMessage, final Throwable cause, final boolean b, final boolean b2) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:360*/if (b2) { /*SL:361*/this.fillInStackTrace(); } else { /*SL:363*/this.stackTrace = null; } /*SL:365*/this.detailMessage = detailMessage; /*SL:366*/this.cause = cause; /*SL:367*/if (!b) { /*SL:368*/this.suppressedExceptions = null; } } private String detailMessage; /*SL:366*/private Throwable cause = this; public String getMessage() { /*SL:378*/return this.detailMessage; } public String getLocalizedMessage() { /*SL:392*/return this.getMessage(); } public synchronized Throwable getCause() { /*SL:416*/return (this.cause == this) ? null : this.cause; } public synchronized Throwable initCause(final Throwable cause) { /*SL:456*/if (this.cause != this) { /*SL:457*/throw new IllegalStateException(\"Can't overwrite cause with \" + /*EL:458*/Objects.toString(cause, \"a null\"), this); } /*SL:459*/if (cause == this) { /*SL:460*/throw new IllegalArgumentException(\"Self-causation not permitted\", this); } /*SL:461*/this.cause = cause; /*SL:462*/return this; } @Override public String toString() { final String name = /*EL:480*/this.getClass().getName(); final String localizedMessage = /*EL:481*/this.getLocalizedMessage(); /*SL:482*/return (localizedMessage != null) ? (name + \": \" + localizedMessage) : name; } public void printStackTrace() { /*SL:635*/this.printStackTrace(System.err); } public void printStackTrace(final PrintStream printStream) { /*SL:644*/this.printStackTrace(new WrappedPrintStream(printStream)); } private void printStackTrace(final PrintStreamOrWriter printStreamOrWriter) { final Set setFromMap = /*EL:651*/Collections.newSetFromMap(new IdentityHashMap()); /*SL:652*/setFromMap.add(this); /*SL:654*/synchronized (printStreamOrWriter.lock()) { /*SL:656*/printStreamOrWriter.println(this); final StackTraceElement[] ourStackTrace; final StackTraceElement[] array = /*EL:658*/ourStackTrace = this.getOurStackTrace(); for (int length = ourStackTrace.length, i = 0; i < length; ++i) { /*SL:659*/printStreamOrWriter.println(\"\\tat \" + ourStackTrace[i]); } final Throwable[] suppressed = /*EL:662*/this.getSuppressed(); for (int length2 = suppressed.length, j = 0; j < length2; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:663*/printStreamOrWriter, array, \"Suppressed: \", \"\\t\", setFromMap); } final Throwable cause = /*EL:666*/this.getCause(); /*SL:667*/if (cause != null) { /*SL:668*/cause.printEnclosedStackTrace(printStreamOrWriter, array, \"Caused by: \", \"\", setFromMap); } } } private void printEnclosedStackTrace(final PrintStreamOrWriter printStreamOrWriter, final StackTraceElement[] array, final String s, final String s2, final Set set) { /*SL:681*/assert Thread.holdsLock(printStreamOrWriter.lock()); /*SL:682*/if (set.contains(this)) { /*SL:683*/printStreamOrWriter.println(\"\\t[CIRCULAR REFERENCE:\" + this + \"]\"); } else { /*SL:685*/set.add(this); final StackTraceElement[] ourStackTrace = /*EL:687*/this.getOurStackTrace(); int n = /*EL:688*/ourStackTrace.length - 1; /*SL:690*/for (int n2 = array.length - 1; n >= 0 && n2 >= 0 && ourStackTrace[n].equals(array[n2]); /*SL:691*/--n, --n2) {} final int n3 = /*EL:693*/ourStackTrace.length - 1 - n; /*SL:696*/printStreamOrWriter.println(s2 + s + this); /*SL:697*/for (int i = 0; i <= n; ++i) { /*SL:698*/printStreamOrWriter.println(s2 + \"\\tat \" + ourStackTrace[i]); } /*SL:699*/if (n3 != 0) { /*SL:700*/printStreamOrWriter.println(s2 + \"\\t... \" + n3 + \" more\"); } final Throwable[] suppressed = /*EL:703*/this.getSuppressed(); for (int length = suppressed.length, j = 0; j < length; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:704*/printStreamOrWriter, ourStackTrace, \"Suppressed: \", s2 + \"\\t\", set); } final Throwable cause = /*EL:708*/this.getCause(); /*SL:709*/if (cause != null) { /*SL:710*/cause.printEnclosedStackTrace(printStreamOrWriter, ourStackTrace, \"Caused by: \", s2, set); } } } public void printStackTrace(final PrintWriter printWriter) { /*SL:722*/this.printStackTrace(new WrappedPrintWriter(printWriter)); } private static class WrappedPrintStream extends PrintStreamOrWriter { /*SL:741*/private final PrintStream printStream = printStream; WrappedPrintStream(final PrintStream printStream) { } @Override Object lock() { /*SL:745*/return this.printStream; } @Override void println(final Object o) { /*SL:749*/this.printStream.println(o); } } private static class WrappedPrintWriter extends PrintStreamOrWriter { /*SL:757*/private final PrintWriter printWriter = printWriter; WrappedPrintWriter(final PrintWriter printWriter) { } @Override Object lock() { /*SL:761*/return this.printWriter; } @Override void println(final Object o) { /*SL:765*/this.printWriter.println(o); } } public synchronized Throwable fillInStackTrace() { /*SL:782*/if (this.stackTrace != null || this.backtrace != null) { /*SL:784*/this.fillInStackTrace(0); /*SL:785*/this.stackTrace = Throwable.UNASSIGNED_STACK; } /*SL:787*/return this; } public StackTraceElement[] getStackTrace() { /*SL:817*/return this.getOurStackTrace().clone(); } private synchronized StackTraceElement[] getOurStackTrace() { /*SL:823*/if (this.stackTrace == Throwable.UNASSIGNED_STACK || (this.stackTrace == null && this.backtrace != null)) { final int stackTraceDepth = /*EL:825*/this.getStackTraceDepth(); /*SL:826*/this.stackTrace = new StackTraceElement[stackTraceDepth]; /*SL:827*/for (int i = 0; i < stackTraceDepth; ++i) { /*SL:828*/this.stackTrace[i] = this.getStackTraceElement(i); } } else/*SL:829*/ if (this.stackTrace == null) { /*SL:830*/return Throwable.UNASSIGNED_STACK; } /*SL:832*/return this.stackTrace; } public void setStackTrace(final StackTraceElement[] array) { final StackTraceElement[] stackTrace = /*EL:865*/array.clone(); /*SL:866*/for (int i = 0; i < stackTrace.length; ++i) { /*SL:867*/if (stackTrace[i] == null) { /*SL:868*/throw new NullPointerException(\"stackTrace[\" + i + \"]\"); } } /*SL:871*/synchronized (this) { /*SL:872*/if (this.stackTrace == null && this.backtrace == null) { /*SL:874*/return; } /*SL:875*/this.stackTrace = stackTrace; } } private void readObject(final ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException { /*SL:915*/objectInputStream.defaultReadObject(); final List suppressedExceptions = /*EL:920*/this.suppressedExceptions; /*SL:921*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; final StackTraceElement[] stackTrace = /*EL:923*/this.stackTrace; /*SL:924*/this.stackTrace = Throwable.UNASSIGNED_STACK.clone(); /*SL:926*/if (suppressedExceptions != null) { final int validateSuppressedExceptionsList = /*EL:927*/this.validateSuppressedExceptionsList(suppressedExceptions); /*SL:928*/if (validateSuppressedExceptionsList > 0) { final ArrayList suppressedExceptions2 = /*EL:929*/new ArrayList(Math.min(100, validateSuppressedExceptionsList)); /*SL:931*/for (final Throwable t : suppressedExceptions) { /*SL:934*/if (t == null) { /*SL:935*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:936*/if (t == this) { /*SL:937*/throw new IllegalArgumentException(\"Self-suppression not permitted\"); } /*SL:938*/suppressedExceptions2.add((Object)t); } /*SL:942*/this.suppressedExceptions = (List)suppressedExceptions2; } } else { /*SL:945*/this.suppressedExceptions = null; } /*SL:957*/if (stackTrace != null) { final StackTraceElement[] stackTrace2 = /*EL:960*/stackTrace.clone(); /*SL:961*/if (stackTrace2.length >= 1) { /*SL:962*/if (stackTrace2.length == 1 && SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(stackTrace2[0])) { /*SL:965*/this.stackTrace = null; } else { final StackTraceElement[] array = /*EL:967*/stackTrace2; for (int length = array.length, i = 0; i < length; ++i) { /*SL:968*/if (array[i] == null) { /*SL:969*/throw new NullPointerException(\"null StackTraceElement in serial stream.\"); } } /*SL:971*/this.stackTrace = stackTrace2; } } } } private int validateSuppressedExceptionsList(final List list) throws IOException { boolean b; try { /*SL:988*/b = (list.getClass().getClassLoader() == null); } catch (final SecurityException ex) { /*SL:990*/b = false; } /*SL:993*/if (!b) { /*SL:994*/throw new StreamCorruptedException(\"List implementation class was not loaded by bootstrap class loader.\"); } final int size = /*EL:997*/list.size(); /*SL:998*/if (size < 0) { /*SL:999*/throw new StreamCorruptedException(\"Negative list size reported.\"); } /*SL:1001*/return size; } private synchronized void writeObject(final ObjectOutputStream objectOutputStream) throws IOException { /*SL:1018*/this.getOurStackTrace(); final StackTraceElement[] stackTrace = /*EL:1020*/this.stackTrace; try { /*SL:1022*/if (this.stackTrace == null) { /*SL:1023*/this.stackTrace = SentinelHolder.STACK_TRACE_SENTINEL; } /*SL:1024*/objectOutputStream.defaultWriteObject(); } finally { /*SL:1026*/this.stackTrace = stackTrace; } } public final synchronized void addSuppressed(final Throwable t) { /*SL:1081*/if (t == this) { /*SL:1082*/throw new IllegalArgumentException(\"Self-suppression not permitted\", t); } /*SL:1084*/if (t == null) { /*SL:1085*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:1087*/if (this.suppressedExceptions == null) { /*SL:1088*/return; } /*SL:1090*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL) { /*SL:1091*/this.suppressedExceptions = new ArrayList(1); } /*SL:1093*/this.suppressedExceptions.add(t); } static { /*SL:1096*/EMPTY_THROWABLE_ARRAY = new Throwable[0]; } public final synchronized Throwable[] getSuppressed() { /*SL:1114*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL || this.suppressedExceptions == null) { /*SL:1116*/return Throwable.EMPTY_THROWABLE_ARRAY; } /*SL:1118*/return this.suppressedExceptions.toArray(Throwable.EMPTY_THROWABLE_ARRAY); } }" + "public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; private transient Object backtrace; private static final StackTraceElement[] UNASSIGNED_STACK; private StackTraceElement[] stackTrace; private static final List SUPPRESSED_SENTINEL; private List suppressedExceptions; private static final String NULL_CAUSE_MESSAGE = \"Cannot suppress a null exception.\"; private static final String SELF_SUPPRESSION_MESSAGE = \"Self-suppression not permitted\"; private static final String CAUSE_CAPTION = \"Caused by: \"; private static final String SUPPRESSED_CAPTION = \"Suppressed: \"; private static final Throwable[] EMPTY_THROWABLE_ARRAY; private native Throwable fillInStackTrace(final int p0); native int getStackTraceDepth(); native StackTraceElement getStackTraceElement(final int p0); private abstract static class PrintStreamOrWriter { abstract Object lock(); abstract void println(final Object p0); } private static class SentinelHolder { public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL; public static final StackTraceElement[] STACK_TRACE_SENTINEL; static { /*SL:146*/STACK_TRACE_ELEMENT_SENTINEL = new StackTraceElement(\"\", \"\", null, Integer.MIN_VALUE); } static { /*SL:153*/STACK_TRACE_SENTINEL = new StackTraceElement[] { SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL }; } } static { /*SL:160*/UNASSIGNED_STACK = new StackTraceElement[0]; } static { /*SL:216*/SUPPRESSED_SENTINEL = Collections.unmodifiableList((List)new ArrayList(0)); } public Throwable() { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:251*/this.fillInStackTrace(); } public Throwable(final String detailMessage) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:266*/this.fillInStackTrace(); /*SL:267*/this.detailMessage = detailMessage; } public Throwable(final String detailMessage, final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:288*/this.fillInStackTrace(); /*SL:289*/this.detailMessage = detailMessage; /*SL:290*/this.cause = cause; } public Throwable(final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:311*/this.fillInStackTrace(); /*SL:312*/this.detailMessage = ((cause == null) ? null : cause.toString()); /*SL:313*/this.cause = cause; } protected Throwable(final String detailMessage, final Throwable cause, final boolean b, final boolean b2) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:360*/if (b2) { /*SL:361*/this.fillInStackTrace(); } else { /*SL:363*/this.stackTrace = null; } /*SL:365*/this.detailMessage = detailMessage; /*SL:366*/this.cause = cause; /*SL:367*/if (!b) { /*SL:368*/this.suppressedExceptions = null; } } private String detailMessage; /*SL:366*/private Throwable cause = this; public String getMessage() { /*SL:378*/return this.detailMessage; } public String getLocalizedMessage() { /*SL:392*/return this.getMessage(); } public synchronized Throwable getCause() { /*SL:416*/return (this.cause == this) ? null : this.cause; } public synchronized Throwable initCause(final Throwable cause) { /*SL:456*/if (this.cause != this) { /*SL:457*/throw new IllegalStateException(\"Can't overwrite cause with \" + /*EL:458*/Objects.toString(cause, \"a null\"), this); } /*SL:459*/if (cause == this) { /*SL:460*/throw new IllegalArgumentException(\"Self-causation not permitted\", this); } /*SL:461*/this.cause = cause; /*SL:462*/return this; } @Override public String toString() { final String name = /*EL:480*/this.getClass().getName(); final String localizedMessage = /*EL:481*/this.getLocalizedMessage(); /*SL:482*/return (localizedMessage != null) ? (name + \": \" + localizedMessage) : name; } public void printStackTrace() { /*SL:635*/this.printStackTrace(System.err); } public void printStackTrace(final PrintStream printStream) { /*SL:644*/this.printStackTrace(new WrappedPrintStream(printStream)); } private void printStackTrace(final PrintStreamOrWriter printStreamOrWriter) { final Set setFromMap = /*EL:651*/Collections.newSetFromMap(new IdentityHashMap()); /*SL:652*/setFromMap.add(this); /*SL:654*/synchronized (printStreamOrWriter.lock()) { /*SL:656*/printStreamOrWriter.println(this); final StackTraceElement[] ourStackTrace; final StackTraceElement[] array = /*EL:658*/ourStackTrace = this.getOurStackTrace(); for (int length = ourStackTrace.length, i = 0; i < length; ++i) { /*SL:659*/printStreamOrWriter.println(\"\\tat \" + ourStackTrace[i]); } final Throwable[] suppressed = /*EL:662*/this.getSuppressed(); for (int length2 = suppressed.length, j = 0; j < length2; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:663*/printStreamOrWriter, array, \"Suppressed: \", \"\\t\", setFromMap); } final Throwable cause = /*EL:666*/this.getCause(); /*SL:667*/if (cause != null) { /*SL:668*/cause.printEnclosedStackTrace(printStreamOrWriter, array, \"Caused by: \", \"\", setFromMap); } } } private void printEnclosedStackTrace(final PrintStreamOrWriter printStreamOrWriter, final StackTraceElement[] array, final String s, final String s2, final Set set) { /*SL:681*/assert Thread.holdsLock(printStreamOrWriter.lock()); /*SL:682*/if (set.contains(this)) { /*SL:683*/printStreamOrWriter.println(s2 + s + \"[CIRCULAR REFERENCE: \" + this + \"]\"); } else { /*SL:685*/set.add(this); final StackTraceElement[] ourStackTrace = /*EL:687*/this.getOurStackTrace(); int n = /*EL:688*/ourStackTrace.length - 1; /*SL:690*/for (int n2 = array.length - 1; n >= 0 && n2 >= 0 && ourStackTrace[n].equals(array[n2]); /*SL:691*/--n, --n2) {} final int n3 = /*EL:693*/ourStackTrace.length - 1 - n; /*SL:696*/printStreamOrWriter.println(s2 + s + this); /*SL:697*/for (int i = 0; i <= n; ++i) { /*SL:698*/printStreamOrWriter.println(s2 + \"\\tat \" + ourStackTrace[i]); } /*SL:699*/if (n3 != 0) { /*SL:700*/printStreamOrWriter.println(s2 + \"\\t... \" + n3 + \" more\"); } final Throwable[] suppressed = /*EL:703*/this.getSuppressed(); for (int length = suppressed.length, j = 0; j < length; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:704*/printStreamOrWriter, ourStackTrace, \"Suppressed: \", s2 + \"\\t\", set); } final Throwable cause = /*EL:708*/this.getCause(); /*SL:709*/if (cause != null) { /*SL:710*/cause.printEnclosedStackTrace(printStreamOrWriter, ourStackTrace, \"Caused by: \", s2, set); } } } public void printStackTrace(final PrintWriter printWriter) { /*SL:722*/this.printStackTrace(new WrappedPrintWriter(printWriter)); } private static class WrappedPrintStream extends PrintStreamOrWriter { /*SL:741*/private final PrintStream printStream = printStream; WrappedPrintStream(final PrintStream printStream) { } @Override Object lock() { /*SL:745*/return this.printStream; } @Override void println(final Object o) { /*SL:749*/this.printStream.println(o); } } private static class WrappedPrintWriter extends PrintStreamOrWriter { /*SL:757*/private final PrintWriter printWriter = printWriter; WrappedPrintWriter(final PrintWriter printWriter) { } @Override Object lock() { /*SL:761*/return this.printWriter; } @Override void println(final Object o) { /*SL:765*/this.printWriter.println(o); } } public synchronized Throwable fillInStackTrace() { /*SL:782*/if (this.stackTrace != null || this.backtrace != null) { /*SL:784*/this.fillInStackTrace(0); /*SL:785*/this.stackTrace = Throwable.UNASSIGNED_STACK; } /*SL:787*/return this; } public StackTraceElement[] getStackTrace() { /*SL:817*/return this.getOurStackTrace().clone(); } private synchronized StackTraceElement[] getOurStackTrace() { /*SL:823*/if (this.stackTrace == Throwable.UNASSIGNED_STACK || (this.stackTrace == null && this.backtrace != null)) { final int stackTraceDepth = /*EL:825*/this.getStackTraceDepth(); /*SL:826*/this.stackTrace = new StackTraceElement[stackTraceDepth]; /*SL:827*/for (int i = 0; i < stackTraceDepth; ++i) { /*SL:828*/this.stackTrace[i] = this.getStackTraceElement(i); } } else/*SL:829*/ if (this.stackTrace == null) { /*SL:830*/return Throwable.UNASSIGNED_STACK; } /*SL:832*/return this.stackTrace; } public void setStackTrace(final StackTraceElement[] array) { final StackTraceElement[] stackTrace = /*EL:865*/array.clone(); /*SL:866*/for (int i = 0; i < stackTrace.length; ++i) { /*SL:867*/if (stackTrace[i] == null) { /*SL:868*/throw new NullPointerException(\"stackTrace[\" + i + \"]\"); } } /*SL:871*/synchronized (this) { /*SL:872*/if (this.stackTrace == null && this.backtrace == null) { /*SL:874*/return; } /*SL:875*/this.stackTrace = stackTrace; } } private void readObject(final ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException { /*SL:915*/objectInputStream.defaultReadObject(); final List suppressedExceptions = /*EL:920*/this.suppressedExceptions; /*SL:921*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; final StackTraceElement[] stackTrace = /*EL:923*/this.stackTrace; /*SL:924*/this.stackTrace = Throwable.UNASSIGNED_STACK.clone(); /*SL:926*/if (suppressedExceptions != null) { final int validateSuppressedExceptionsList = /*EL:927*/this.validateSuppressedExceptionsList(suppressedExceptions); /*SL:928*/if (validateSuppressedExceptionsList > 0) { final ArrayList suppressedExceptions2 = /*EL:929*/new ArrayList(Math.min(100, validateSuppressedExceptionsList)); /*SL:931*/for (final Throwable t : suppressedExceptions) { /*SL:934*/if (t == null) { /*SL:935*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:936*/if (t == this) { /*SL:937*/throw new IllegalArgumentException(\"Self-suppression not permitted\"); } /*SL:938*/suppressedExceptions2.add((Object)t); } /*SL:942*/this.suppressedExceptions = (List)suppressedExceptions2; } } else { /*SL:945*/this.suppressedExceptions = null; } /*SL:957*/if (stackTrace != null) { final StackTraceElement[] stackTrace2 = /*EL:960*/stackTrace.clone(); /*SL:961*/if (stackTrace2.length >= 1) { /*SL:962*/if (stackTrace2.length == 1 && SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(stackTrace2[0])) { /*SL:965*/this.stackTrace = null; } else { final StackTraceElement[] array = /*EL:967*/stackTrace2; for (int length = array.length, i = 0; i < length; ++i) { /*SL:968*/if (array[i] == null) { /*SL:969*/throw new NullPointerException(\"null StackTraceElement in serial stream.\"); } } /*SL:971*/this.stackTrace = stackTrace2; } } } } private int validateSuppressedExceptionsList(final List list) throws IOException { /*SL:984*/if (Object.class.getClassLoader() != list.getClass().getClassLoader()) { /*SL:985*/throw new StreamCorruptedException(\"List implementation not on the bootclasspath.\"); } final int size = /*EL:987*/list.size(); /*SL:988*/if (size < 0) { /*SL:989*/throw new StreamCorruptedException(\"Negative list size reported.\"); } /*SL:991*/return size; } private synchronized void writeObject(final ObjectOutputStream objectOutputStream) throws IOException { /*SL:1008*/this.getOurStackTrace(); final StackTraceElement[] stackTrace = /*EL:1010*/this.stackTrace; try { /*SL:1012*/if (this.stackTrace == null) { /*SL:1013*/this.stackTrace = SentinelHolder.STACK_TRACE_SENTINEL; } /*SL:1014*/objectOutputStream.defaultWriteObject(); } finally { /*SL:1016*/this.stackTrace = stackTrace; } } public final synchronized void addSuppressed(final Throwable t) { /*SL:1071*/if (t == this) { /*SL:1072*/throw new IllegalArgumentException(\"Self-suppression not permitted\", t); } /*SL:1074*/if (t == null) { /*SL:1075*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:1077*/if (this.suppressedExceptions == null) { /*SL:1078*/return; } /*SL:1080*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL) { /*SL:1081*/this.suppressedExceptions = new ArrayList(1); } /*SL:1083*/this.suppressedExceptions.add(t); } static { /*SL:1086*/EMPTY_THROWABLE_ARRAY = new Throwable[0]; } public final synchronized Throwable[] getSuppressed() { /*SL:1104*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL || this.suppressedExceptions == null) { /*SL:1106*/return Throwable.EMPTY_THROWABLE_ARRAY; } /*SL:1108*/return this.suppressedExceptions.toArray(Throwable.EMPTY_THROWABLE_ARRAY); } }" ); } From b3a50e57f8a7e5cc0221b404d29d7bfaf153840f Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 10:04:44 +0100 Subject: [PATCH 46/58] Create manual-release.yml --- .github/workflows/manual-release.yml | 130 +++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 .github/workflows/manual-release.yml diff --git a/.github/workflows/manual-release.yml b/.github/workflows/manual-release.yml new file mode 100644 index 00000000..41216ac7 --- /dev/null +++ b/.github/workflows/manual-release.yml @@ -0,0 +1,130 @@ +name: Manual Release + +on: + workflow_dispatch: + inputs: + next_snapshot_version: + description: Optional. Next snapshot version in x.y.z-SNAPSHOT format (example: 0.6.3-SNAPSHOT). If empty, we bump the patch number. + required: false + default: "" + version_file: + description: Path to the Java file that contains the VERSION constant. + required: false + default: "Procyon.Core/src/main/java/com/strobel/Procyon.java" + +permissions: + contents: write + +concurrency: + group: manual-release-${{ github.ref }} + cancel-in-progress: false + +jobs: + release: + if: ${{ github.ref_type == 'branch' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + ref: ${{ github.ref }} + + - name: Prepare release, tag, and next snapshot + env: + VERSION_FILE: ${{ github.event.inputs.version_file }} + NEXT_SNAPSHOT_INPUT: ${{ github.event.inputs.next_snapshot_version }} + BRANCH_NAME: ${{ github.ref_name }} + run: | + set -euo pipefail + + if [[ -z "${VERSION_FILE}" ]]; then + VERSION_FILE="Procyon.Core/src/main/java/com/strobel/Procyon.java" + fi + + if [[ ! -f "${VERSION_FILE}" ]]; then + echo "Version file not found: ${VERSION_FILE}" + exit 1 + fi + + if [[ -n "$(git status --porcelain)" ]]; then + echo "Working tree is not clean. Please run the workflow from a clean branch state." + git status --porcelain + exit 1 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + version_line="$(grep -E 'private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=' "${VERSION_FILE}" | head -n 1 || true)" + if [[ -z "${version_line}" ]]; then + echo "Could not find VERSION constant in: ${VERSION_FILE}" + exit 1 + fi + + current_version="$(echo "${version_line}" | sed -E 's/.*VERSION[[:space:]]*=[[:space:]]*"([^"]+)".*/\1/')" + if [[ -z "${current_version}" ]]; then + echo "Could not extract current version from VERSION constant in: ${VERSION_FILE}" + exit 1 + fi + + if [[ "${current_version}" != *-SNAPSHOT ]]; then + echo "Expected a -SNAPSHOT version, but found: ${current_version}" + exit 1 + fi + + release_version="${current_version%-SNAPSHOT}" + + if [[ ! "${release_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Release version must be in x.y.z format. Found: ${release_version}" + exit 1 + fi + + if [[ -n "${NEXT_SNAPSHOT_INPUT}" ]]; then + next_snapshot_version="${NEXT_SNAPSHOT_INPUT}" + else + IFS='.' read -r major minor patch <<< "${release_version}" + patch=$((patch + 1)) + next_snapshot_version="${major}.${minor}.${patch}-SNAPSHOT" + fi + + if [[ ! "${next_snapshot_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+-SNAPSHOT$ ]]; then + echo "Next snapshot version must be in x.y.z-SNAPSHOT format. Found: ${next_snapshot_version}" + exit 1 + fi + + release_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${release_version}\2/" + next_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${next_snapshot_version}\2/" + + # We set the version to the release version (remove -SNAPSHOT), then commit and push. + sed -i -E "${release_sed_expr}" "${VERSION_FILE}" + + if git diff --quiet; then + echo "No changes after setting release version. Refusing to continue." + exit 1 + fi + + git add "${VERSION_FILE}" + git commit -m "prepare release ${release_version}" + git push origin "HEAD:${BRANCH_NAME}" + + if git rev-parse -q --verify "refs/tags/${release_version}" >/dev/null; then + echo "Tag already exists: ${release_version}" + exit 1 + fi + + git tag "${release_version}" + git push origin "refs/tags/${release_version}" + + # We set the version to the next development snapshot, then commit and push. + sed -i -E "${next_sed_expr}" "${VERSION_FILE}" + + if git diff --quiet; then + echo "No changes after setting next snapshot version. Refusing to continue." + exit 1 + fi + + git add "${VERSION_FILE}" + git commit -m "prepare for next development iteration ${next_snapshot_version}" + git push origin "HEAD:${BRANCH_NAME}" From 7f12d9c1442388d70a994292d0fddef314a626f7 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 10:09:13 +0100 Subject: [PATCH 47/58] Fix manual-release.yml --- .github/workflows/manual-release.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/manual-release.yml b/.github/workflows/manual-release.yml index 41216ac7..4e4aa6e8 100644 --- a/.github/workflows/manual-release.yml +++ b/.github/workflows/manual-release.yml @@ -4,11 +4,11 @@ on: workflow_dispatch: inputs: next_snapshot_version: - description: Optional. Next snapshot version in x.y.z-SNAPSHOT format (example: 0.6.3-SNAPSHOT). If empty, we bump the patch number. + description: "Optional. Next snapshot version in x.y.z-SNAPSHOT format (example: 0.6.3-SNAPSHOT). If empty, we bump the patch number." required: false default: "" version_file: - description: Path to the Java file that contains the VERSION constant. + description: "Path to the Java file that contains the VERSION constant." required: false default: "Procyon.Core/src/main/java/com/strobel/Procyon.java" @@ -97,7 +97,6 @@ jobs: release_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${release_version}\2/" next_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${next_snapshot_version}\2/" - # We set the version to the release version (remove -SNAPSHOT), then commit and push. sed -i -E "${release_sed_expr}" "${VERSION_FILE}" if git diff --quiet; then @@ -117,7 +116,6 @@ jobs: git tag "${release_version}" git push origin "refs/tags/${release_version}" - # We set the version to the next development snapshot, then commit and push. sed -i -E "${next_sed_expr}" "${VERSION_FILE}" if git diff --quiet; then From 767d79cf01e90cd3a94ef0d8848d266bd6e9929b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jan 2026 09:10:21 +0000 Subject: [PATCH 48/58] prepare release 0.6.2 --- Procyon.Core/src/main/java/com/strobel/Procyon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procyon.Core/src/main/java/com/strobel/Procyon.java b/Procyon.Core/src/main/java/com/strobel/Procyon.java index 7c06c76e..5fc4a8fa 100644 --- a/Procyon.Core/src/main/java/com/strobel/Procyon.java +++ b/Procyon.Core/src/main/java/com/strobel/Procyon.java @@ -14,7 +14,7 @@ package com.strobel; public final class Procyon { - private static final String VERSION = "0.6.2-SNAPSHOT"; + private static final String VERSION = "0.6.2"; public static String version() { return VERSION; From 94c89b3f63dd449580026441e7670d04f862dbee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jan 2026 09:10:22 +0000 Subject: [PATCH 49/58] prepare for next development iteration 0.6.3-SNAPSHOT --- Procyon.Core/src/main/java/com/strobel/Procyon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procyon.Core/src/main/java/com/strobel/Procyon.java b/Procyon.Core/src/main/java/com/strobel/Procyon.java index 5fc4a8fa..20d89add 100644 --- a/Procyon.Core/src/main/java/com/strobel/Procyon.java +++ b/Procyon.Core/src/main/java/com/strobel/Procyon.java @@ -14,7 +14,7 @@ package com.strobel; public final class Procyon { - private static final String VERSION = "0.6.2"; + private static final String VERSION = "0.6.3-SNAPSHOT"; public static String version() { return VERSION; From 2c59a051bbdc1fb66053723939803dfeeff0fe1a Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 12:04:18 +0100 Subject: [PATCH 50/58] manual-release.yml: add comments --- .github/workflows/manual-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/manual-release.yml b/.github/workflows/manual-release.yml index 4e4aa6e8..5e6b0b69 100644 --- a/.github/workflows/manual-release.yml +++ b/.github/workflows/manual-release.yml @@ -97,6 +97,7 @@ jobs: release_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${release_version}\2/" next_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${next_snapshot_version}\2/" + # We set the version to the release version (remove -SNAPSHOT), then commit and push. sed -i -E "${release_sed_expr}" "${VERSION_FILE}" if git diff --quiet; then @@ -116,6 +117,7 @@ jobs: git tag "${release_version}" git push origin "refs/tags/${release_version}" + # We set the version to the next development snapshot, then commit and push. sed -i -E "${next_sed_expr}" "${VERSION_FILE}" if git diff --quiet; then From 51e7f59728853d8dccb722596bab5877f201e8ac Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 13:00:51 +0100 Subject: [PATCH 51/58] improve coverage with DecompilerDriverTest --- Procyon.Decompiler/build.gradle | 1 + .../strobel/decompiler/DecompilerDriver.java | 2 +- .../decompiler/DecompilerDriverTest.java | 69 + .../test/resources/jar/all-java-syntaxes.jar | Bin 0 -> 31278 bytes .../src/test/resources/jar/platform-1.0.0.jar | Bin 0 -> 6567 bytes .../all-java-syntaxes-bytecode.txt | 5846 +++++++++++++++++ .../all-java-syntaxes/all-java-syntaxes.txt | 799 +++ .../txt/platform-1.0.0/module-info.txt | 16 + .../platform-1.0.0-bytecode.txt | 342 + 9 files changed, 7074 insertions(+), 1 deletion(-) create mode 100644 Procyon.Decompiler/src/test/java/com/strobel/decompiler/DecompilerDriverTest.java create mode 100644 Procyon.Decompiler/src/test/resources/jar/all-java-syntaxes.jar create mode 100644 Procyon.Decompiler/src/test/resources/jar/platform-1.0.0.jar create mode 100644 Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt create mode 100644 Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes.txt create mode 100644 Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/module-info.txt create mode 100644 Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/platform-1.0.0-bytecode.txt diff --git a/Procyon.Decompiler/build.gradle b/Procyon.Decompiler/build.gradle index 414375f7..696ab3ae 100644 --- a/Procyon.Decompiler/build.gradle +++ b/Procyon.Decompiler/build.gradle @@ -14,4 +14,5 @@ dependencies { compile 'com.beust:jcommander:1.82' compile project(':Procyon.Core') compile project(':Procyon.CompilerTools') + testCompile 'commons-io:commons-io:2.20.0' } diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java index 84d1b55f..3321a910 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java @@ -64,7 +64,7 @@ import java.util.logging.Logger; public class DecompilerDriver { - public static void main(final String[] args) { + public static void main(final String... args) { final CommandLineOptions options = new CommandLineOptions(); final JCommander jCommander; final List typeNames; diff --git a/Procyon.Decompiler/src/test/java/com/strobel/decompiler/DecompilerDriverTest.java b/Procyon.Decompiler/src/test/java/com/strobel/decompiler/DecompilerDriverTest.java new file mode 100644 index 00000000..227d0115 --- /dev/null +++ b/Procyon.Decompiler/src/test/java/com/strobel/decompiler/DecompilerDriverTest.java @@ -0,0 +1,69 @@ +package com.strobel.decompiler; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +public class DecompilerDriverTest { + + private void assertEqualsIgnoreEOL(String expected, String actual) { + assertEquals(expected.replaceAll("\\s*\r?\n", "\n"), actual.replaceAll("\\s*\r?\n", "\n")); + } + + private String getResourceAsString(String path) throws IOException { + return IOUtils.toString(getClass().getResource(path), UTF_8); + } + + private String getFileAsString(File outputDir, String pathname) throws IOException { + return FileUtils.readFileToString(new File(outputDir, pathname), UTF_8); + } + + @Test + public void testDecompileModule() throws Exception { + File outputDir = new File("build/platform-1.0.0_decompiled"); + DecompilerDriver.main("src/test/resources/jar/platform-1.0.0.jar", "--suppress-banner", "-o", outputDir.getAbsolutePath()); + assertEqualsIgnoreEOL(getResourceAsString("/txt/platform-1.0.0/module-info.txt"), getFileAsString(outputDir, "module-info.java")); + } + + @Test + public void testDecompileModuleByteCode() throws Exception { + PrintStream systemOut = System.out; + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out, true, UTF_8.name())); + DecompilerDriver.main("src/test/resources/jar/platform-1.0.0.jar", "--suppress-banner", "-r", "-cp", "-lv", "-ta", "-v"); + assertEqualsIgnoreEOL(getResourceAsString("/txt/platform-1.0.0/platform-1.0.0-bytecode.txt"), new String(out.toByteArray(), UTF_8)); + } finally { + System.setOut(systemOut); + } + } + + @Test + public void testDecompileAllJavaSyntaxes() throws Exception { + File outputDir = new File("build/all-java-syntaxes"); + DecompilerDriver.main("src/test/resources/jar/all-java-syntaxes.jar", "--suppress-banner", "-o", outputDir.getAbsolutePath()); + assertEqualsIgnoreEOL(getResourceAsString("/txt/all-java-syntaxes/all-java-syntaxes.txt"), getFileAsString(outputDir, "demo/AllJavaSyntaxes.java")); + } + + @Test + public void testDecompileAllJavaSyntaxesByteCode() throws Exception { + PrintStream systemOut = System.out; + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out, true, UTF_8.name())); + DecompilerDriver.main("src/test/resources/jar/all-java-syntaxes.jar", "--suppress-banner", "-r", "-cp", "-lv", "-ta", "-v"); + assertEqualsIgnoreEOL(getResourceAsString("/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt"), new String(out.toByteArray(), UTF_8)); + } finally { + System.setOut(systemOut); + } + } + +} diff --git a/Procyon.Decompiler/src/test/resources/jar/all-java-syntaxes.jar b/Procyon.Decompiler/src/test/resources/jar/all-java-syntaxes.jar new file mode 100644 index 0000000000000000000000000000000000000000..a01d2b914e75b44f0806216c0880d7c15f7c816d GIT binary patch literal 31278 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
    b%b1rp`ePet)euRsbh%b-&KI`hqDIWTk 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 literal 0 HcmV?d00001 diff --git a/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt new file mode 100644 index 00000000..eb8dcb17 --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt @@ -0,0 +1,5846 @@ +class demo.AllJavaSyntaxes + Minor version: 0 + Major version: 69 + Flags: PUBLIC, ABSTRACT, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: ;>Ljava/util/ArrayList;Ljava/io/Serializable;Ljava/lang/Comparable;Ljava/lang/Iterable; + BootstrapMethods: + 0: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$0:()Ljava/lang/String; + ()Ljava/lang/String; + 1: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)V + invokevirtual java/io/PrintStream.println:(Ljava/lang/Object;)V + (Ljava/lang/Object;)V + 2: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)Ljava/lang/Object; + invokevirtual java/lang/Object.toString:()Ljava/lang/String; + (Ljava/lang/Object;)Ljava/lang/String; + 3: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (I)Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$3:(I)[Ljava/lang/Object; + (I)[Ljava/lang/Object; + 4: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$4:()Ljava/lang/String; + ()Ljava/lang/String; + 5: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)Ljava/lang/Object; + invokevirtual java/lang/String.length:()I + (Ljava/lang/String;)Ljava/lang/Integer; + 6: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)V + invokespecial demo/AllJavaSyntaxes.lambda$6:(Ljava/lang/Integer;)V + (Ljava/lang/Integer;)V + 7: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;Ljava/lang/Object;)I + invokestatic demo/AllJavaSyntaxes.lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + (Ljava/lang/String;Ljava/lang/String;)I + 8: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;Ljava/lang/Object;)I + invokestatic demo/AllJavaSyntaxes.lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + (Ljava/lang/String;Ljava/lang/String;)I + 9: invokestatic java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + java.lang.String.class + 10: invokestatic java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + demo.AllJavaSyntaxes.Circle.class + demo.AllJavaSyntaxes.Rectangle.class + 11: invokestatic java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + demo.AllJavaSyntaxes.Success.class + demo.AllJavaSyntaxes.Failure.class + 12: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "success:\u0001" + 13: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "failure:\u0001" + 14: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "\u0001\u0001\u0001" + 15: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)Ljava/lang/Object; + invokevirtual java/lang/Object.toString:()Ljava/lang/String; + (Ljava/lang/Integer;)Ljava/lang/String; + 16: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$10:()Ljava/lang/IllegalArgumentException; + ()Ljava/lang/IllegalArgumentException; + 17: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "\u0001\u0001\u0001\u0001\u0001\u0001" + 18: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$12:()Ljava/lang/Integer; + ()Ljava/lang/Integer; + 19: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;Ljava/lang/Object;)I + invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + (Ljava/lang/String;Ljava/lang/String;)I + 20: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()V + invokespecial demo/AllJavaSyntaxes.lambda$14:()V + ()V + 21: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + newinvokespecial java/util/ArrayList.:()V + ()Ljava/util/ArrayList; + 22: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "\u0001:\u0001" + 23: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "length=\u0001" + InnerClasses: + demo/AllJavaSyntaxes$1 + Local = demo/AllJavaSyntaxes$1Local + demo/AllJavaSyntaxes$2 + abstract static interface AdvancedInterface = demo/AllJavaSyntaxes$AdvancedInterface of demo/AllJavaSyntaxes + abstract static Base = demo/AllJavaSyntaxes$Base of demo/AllJavaSyntaxes + static final Circle = demo/AllJavaSyntaxes$Circle of demo/AllJavaSyntaxes + static final enum Day = demo/AllJavaSyntaxes$Day of demo/AllJavaSyntaxes + Derived = demo/AllJavaSyntaxes$Derived of demo/AllJavaSyntaxes + static Entity = demo/AllJavaSyntaxes$Entity of demo/AllJavaSyntaxes + static final Failure = demo/AllJavaSyntaxes$Failure of demo/AllJavaSyntaxes + static GenericConstructor = demo/AllJavaSyntaxes$GenericConstructor of demo/AllJavaSyntaxes + abstract static interface Identified = demo/AllJavaSyntaxes$Identified of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Inner of demo/AllJavaSyntaxes + abstract static interface Marker = demo/AllJavaSyntaxes$Marker of demo/AllJavaSyntaxes + abstract static interface Named = demo/AllJavaSyntaxes$Named of demo/AllJavaSyntaxes + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + Deep = demo/AllJavaSyntaxes$Outer$Inner$Deep of demo/AllJavaSyntaxes$Outer$Inner + static StaticNested = demo/AllJavaSyntaxes$Outer$StaticNested of demo/AllJavaSyntaxes$Outer + static final Rec = demo/AllJavaSyntaxes$Rec of demo/AllJavaSyntaxes + static final Rectangle = demo/AllJavaSyntaxes$Rectangle of demo/AllJavaSyntaxes + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + static strictfp StrictClass = demo/AllJavaSyntaxes$StrictClass of demo/AllJavaSyntaxes + static final Success = demo/AllJavaSyntaxes$Success of demo/AllJavaSyntaxes + SuperInner = demo/AllJavaSyntaxes$SuperInner of demo/AllJavaSyntaxes + SuperOuter = demo/AllJavaSyntaxes$SuperOuter of demo/AllJavaSyntaxes + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + Tagged = demo/AllJavaSyntaxes$Tagged of demo/AllJavaSyntaxes + abstract static interface Tags = demo/AllJavaSyntaxes$Tags of demo/AllJavaSyntaxes + abstract static interface TypeUse = demo/AllJavaSyntaxes$TypeUse of demo/AllJavaSyntaxes + abstract static interface WithDefaults = demo/AllJavaSyntaxes$WithDefaults of demo/AllJavaSyntaxes + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestMembers: 00 25 02 3A 01 CF 02 49 02 FC 02 FF 01 6C 01 22 03 04 03 07 01 91 03 0B 01 55 03 0F 03 41 03 12 01 57 03 16 03 43 03 45 02 37 02 2E 02 32 02 3F 03 1C 01 72 01 A0 01 80 03 22 01 86 03 26 03 47 03 29 03 2C 03 2F 03 32 03 35 03 38 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes + 2: Utf8StringConstant "demo/AllJavaSyntaxes" + 3: TypeInfo #4 // java/util/ArrayList + 4: Utf8StringConstant "java/util/ArrayList" + 5: TypeInfo #6 // java/io/Serializable + 6: Utf8StringConstant "java/io/Serializable" + 7: TypeInfo #8 // java/lang/Comparable + 8: Utf8StringConstant "java/lang/Comparable" + 9: TypeInfo #10 // java/lang/Iterable + 10: Utf8StringConstant "java/lang/Iterable" + 11: Utf8StringConstant "serialVersionUID" + 12: Utf8StringConstant "J" + 13: Utf8StringConstant "ConstantValue" + 14: LongConstant 1L + 16: Utf8StringConstant "CHARS" + 17: Utf8StringConstant "[C" + 18: Utf8StringConstant "COUNTER" + 19: Utf8StringConstant "Ljava/util/concurrent/atomic/AtomicInteger;" + 20: Utf8StringConstant "callable" + 21: Utf8StringConstant "Ljava/util/concurrent/Callable;" + 22: Utf8StringConstant "Signature" + 23: Utf8StringConstant "Ljava/util/concurrent/Callable;" + 24: Utf8StringConstant "$assertionsDisabled" + 25: Utf8StringConstant "Z" + 26: Utf8StringConstant "$SWITCH_TABLE$demo$AllJavaSyntaxes$Day" + 27: Utf8StringConstant "[I" + 28: Utf8StringConstant "" + 29: Utf8StringConstant "()V" + 30: Utf8StringConstant "Code" + 31: MethodReference #32.#34 // java/lang/Class.desiredAssertionStatus:()Z + 32: TypeInfo #33 // java/lang/Class + 33: Utf8StringConstant "java/lang/Class" + 34: NameAndTypeDescriptor #35.#36 // desiredAssertionStatus:()Z + 35: Utf8StringConstant "desiredAssertionStatus" + 36: Utf8StringConstant "()Z" + 37: FieldReference #1.#38 // demo/AllJavaSyntaxes.$assertionsDisabled:Z + 38: NameAndTypeDescriptor #24.#25 // $assertionsDisabled:Z + 39: FieldReference #1.#40 // demo/AllJavaSyntaxes.CHARS:[C + 40: NameAndTypeDescriptor #16.#17 // CHARS:[C + 41: TypeInfo #42 // java/util/concurrent/atomic/AtomicInteger + 42: Utf8StringConstant "java/util/concurrent/atomic/AtomicInteger" + 43: MethodReference #41.#44 // java/util/concurrent/atomic/AtomicInteger.:()V + 44: NameAndTypeDescriptor #45.#29 // :()V + 45: Utf8StringConstant "" + 46: FieldReference #1.#47 // demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 47: NameAndTypeDescriptor #18.#19 // COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 48: MethodReference #1.#49 // demo/AllJavaSyntaxes.init:()V + 49: NameAndTypeDescriptor #50.#29 // init:()V + 50: Utf8StringConstant "init" + 51: Utf8StringConstant "LineNumberTable" + 52: Utf8StringConstant "LocalVariableTable" + 53: Utf8StringConstant "x" + 54: Utf8StringConstant "I" + 55: Utf8StringConstant "y" + 56: Utf8StringConstant "StackMapTable" + 57: MethodReference #3.#44 // java/util/ArrayList.:()V + 58: InvokeDynamicInfo 0, #60.#61 // call:()Ljava/util/concurrent/Callable; + 59: NameAndTypeDescriptor #60.#61 // call:()Ljava/util/concurrent/Callable; + 60: Utf8StringConstant "call" + 61: Utf8StringConstant "()Ljava/util/concurrent/Callable;" + 62: FieldReference #1.#63 // demo/AllJavaSyntaxes.callable:Ljava/util/concurrent/Callable; + 63: NameAndTypeDescriptor #20.#21 // callable:Ljava/util/concurrent/Callable; + 64: Utf8StringConstant "this" + 65: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 66: Utf8StringConstant "LocalVariableTypeTable" + 67: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 68: Utf8StringConstant "deprecatedMethod" + 69: Utf8StringConstant "Deprecated" + 70: Utf8StringConstant "RuntimeVisibleAnnotations" + 71: Utf8StringConstant "Ljava/lang/Deprecated;" + 72: Utf8StringConstant "forRemoval" + 73: IntegerConstant 1 + 74: Utf8StringConstant "since" + 75: Utf8StringConstant "11" + 76: MethodReference #41.#77 // java/util/concurrent/atomic/AtomicInteger.incrementAndGet:()I + 77: NameAndTypeDescriptor #78.#79 // incrementAndGet:()I + 78: Utf8StringConstant "incrementAndGet" + 79: Utf8StringConstant "()I" + 80: Utf8StringConstant "methodReferencesAndLambdas" + 81: Utf8StringConstant "([Ljava/lang/Object;)[Ljava/lang/Object;" + 82: Utf8StringConstant "([TT;)[Ljava/lang/Object;" + 83: Utf8StringConstant "Ljava/lang/SafeVarargs;" + 84: InterfaceMethodReference #85.#87 // java/util/stream/Stream.of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 85: TypeInfo #86 // java/util/stream/Stream + 86: Utf8StringConstant "java/util/stream/Stream" + 87: NameAndTypeDescriptor #88.#89 // of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 88: Utf8StringConstant "of" + 89: Utf8StringConstant "([Ljava/lang/Object;)Ljava/util/stream/Stream;" + 90: FieldReference #91.#93 // java/lang/System.out:Ljava/io/PrintStream; + 91: TypeInfo #92 // java/lang/System + 92: Utf8StringConstant "java/lang/System" + 93: NameAndTypeDescriptor #94.#95 // out:Ljava/io/PrintStream; + 94: Utf8StringConstant "out" + 95: Utf8StringConstant "Ljava/io/PrintStream;" + 96: MethodReference #97.#99 // java/lang/Object.getClass:()Ljava/lang/Class; + 97: TypeInfo #98 // java/lang/Object + 98: Utf8StringConstant "java/lang/Object" + 99: NameAndTypeDescriptor #100.#101 // getClass:()Ljava/lang/Class; + 100: Utf8StringConstant "getClass" + 101: Utf8StringConstant "()Ljava/lang/Class;" + 102: InvokeDynamicInfo 1, #104.#105 // accept:(Ljava/io/PrintStream;)Ljava/util/function/Consumer; + 103: NameAndTypeDescriptor #104.#105 // accept:(Ljava/io/PrintStream;)Ljava/util/function/Consumer; + 104: Utf8StringConstant "accept" + 105: Utf8StringConstant "(Ljava/io/PrintStream;)Ljava/util/function/Consumer;" + 106: InterfaceMethodReference #85.#107 // java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V + 107: NameAndTypeDescriptor #108.#109 // forEach:(Ljava/util/function/Consumer;)V + 108: Utf8StringConstant "forEach" + 109: Utf8StringConstant "(Ljava/util/function/Consumer;)V" + 110: InvokeDynamicInfo 2, #112.#113 // apply:()Ljava/util/function/Function; + 111: NameAndTypeDescriptor #112.#113 // apply:()Ljava/util/function/Function; + 112: Utf8StringConstant "apply" + 113: Utf8StringConstant "()Ljava/util/function/Function;" + 114: InterfaceMethodReference #85.#115 // java/util/stream/Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; + 115: NameAndTypeDescriptor #116.#117 // map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; + 116: Utf8StringConstant "map" + 117: Utf8StringConstant "(Ljava/util/function/Function;)Ljava/util/stream/Stream;" + 118: InvokeDynamicInfo 3, #112.#120 // apply:()Ljava/util/function/IntFunction; + 119: NameAndTypeDescriptor #112.#120 // apply:()Ljava/util/function/IntFunction; + 120: Utf8StringConstant "()Ljava/util/function/IntFunction;" + 121: InterfaceMethodReference #85.#122 // java/util/stream/Stream.toArray:(Ljava/util/function/IntFunction;)[Ljava/lang/Object; + 122: NameAndTypeDescriptor #123.#124 // toArray:(Ljava/util/function/IntFunction;)[Ljava/lang/Object; + 123: Utf8StringConstant "toArray" + 124: Utf8StringConstant "(Ljava/util/function/IntFunction;)[Ljava/lang/Object;" + 125: Utf8StringConstant "arguments" + 126: Utf8StringConstant "[Ljava/lang/Object;" + 127: Utf8StringConstant "classicFor" + 128: Utf8StringConstant "([Ljava/lang/String;)V" + 129: MethodReference #1.#130 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 130: NameAndTypeDescriptor #131.#132 // log:(Ljava/lang/String;)V + 131: Utf8StringConstant "log" + 132: Utf8StringConstant "(Ljava/lang/String;)V" + 133: Utf8StringConstant "[Ljava/lang/String;" + 134: Utf8StringConstant "index" + 135: Utf8StringConstant "whileLoop" + 136: Utf8StringConstant "doWhileLoop" + 137: Utf8StringConstant "lambdaAndOptional" + 138: InvokeDynamicInfo 4, #140.#141 // get:()Ljava/util/function/Supplier; + 139: NameAndTypeDescriptor #140.#141 // get:()Ljava/util/function/Supplier; + 140: Utf8StringConstant "get" + 141: Utf8StringConstant "()Ljava/util/function/Supplier;" + 142: InvokeDynamicInfo 5, #112.#113 // apply:()Ljava/util/function/Function; + 143: InterfaceMethodReference #144.#146 // java/util/function/Supplier.get:()Ljava/lang/Object; + 144: TypeInfo #145 // java/util/function/Supplier + 145: Utf8StringConstant "java/util/function/Supplier" + 146: NameAndTypeDescriptor #140.#147 // get:()Ljava/lang/Object; + 147: Utf8StringConstant "()Ljava/lang/Object;" + 148: TypeInfo #149 // java/lang/String + 149: Utf8StringConstant "java/lang/String" + 150: MethodReference #151.#153 // java/util/Optional.ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 151: TypeInfo #152 // java/util/Optional + 152: Utf8StringConstant "java/util/Optional" + 153: NameAndTypeDescriptor #154.#155 // ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 154: Utf8StringConstant "ofNullable" + 155: Utf8StringConstant "(Ljava/lang/Object;)Ljava/util/Optional;" + 156: MethodReference #151.#157 // java/util/Optional.map:(Ljava/util/function/Function;)Ljava/util/Optional; + 157: NameAndTypeDescriptor #116.#158 // map:(Ljava/util/function/Function;)Ljava/util/Optional; + 158: Utf8StringConstant "(Ljava/util/function/Function;)Ljava/util/Optional;" + 159: InvokeDynamicInfo 6, #104.#161 // accept:(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer; + 160: NameAndTypeDescriptor #104.#161 // accept:(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer; + 161: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer;" + 162: MethodReference #151.#163 // java/util/Optional.ifPresent:(Ljava/util/function/Consumer;)V + 163: NameAndTypeDescriptor #164.#109 // ifPresent:(Ljava/util/function/Consumer;)V + 164: Utf8StringConstant "ifPresent" + 165: Utf8StringConstant "supplier" + 166: Utf8StringConstant "Ljava/util/function/Supplier;" + 167: Utf8StringConstant "function" + 168: Utf8StringConstant "Ljava/util/function/Function;" + 169: Utf8StringConstant "Ljava/util/function/Supplier;" + 170: Utf8StringConstant "Ljava/util/function/Function;" + 171: Utf8StringConstant "typedLambdaParams" + 172: Utf8StringConstant "(Ljava/util/List;)V" + 173: Utf8StringConstant "(Ljava/util/List;)V" + 174: InvokeDynamicInfo 7, #176.#177 // compare:()Ljava/util/Comparator; + 175: NameAndTypeDescriptor #176.#177 // compare:()Ljava/util/Comparator; + 176: Utf8StringConstant "compare" + 177: Utf8StringConstant "()Ljava/util/Comparator;" + 178: InterfaceMethodReference #179.#181 // java/util/List.sort:(Ljava/util/Comparator;)V + 179: TypeInfo #180 // java/util/List + 180: Utf8StringConstant "java/util/List" + 181: NameAndTypeDescriptor #182.#183 // sort:(Ljava/util/Comparator;)V + 182: Utf8StringConstant "sort" + 183: Utf8StringConstant "(Ljava/util/Comparator;)V" + 184: Utf8StringConstant "list" + 185: Utf8StringConstant "Ljava/util/List;" + 186: Utf8StringConstant "Ljava/util/List;" + 187: Utf8StringConstant "unTypedLambdaParams" + 188: InvokeDynamicInfo 8, #176.#177 // compare:()Ljava/util/Comparator; + 189: Utf8StringConstant "synchronizedMethod" + 190: StringConstant #191 // "synchronized" + 191: Utf8StringConstant "synchronized" + 192: Utf8StringConstant "tryCatchFinally" + 193: MethodReference #41.#194 // java/util/concurrent/atomic/AtomicInteger.get:()I + 194: NameAndTypeDescriptor #140.#79 // get:()I + 195: TypeInfo #196 // java/lang/IllegalStateException + 196: Utf8StringConstant "java/lang/IllegalStateException" + 197: MethodReference #195.#44 // java/lang/IllegalStateException.:()V + 198: MethodReference #32.#199 // java/lang/Class.getSimpleName:()Ljava/lang/String; + 199: NameAndTypeDescriptor #200.#201 // getSimpleName:()Ljava/lang/String; + 200: Utf8StringConstant "getSimpleName" + 201: Utf8StringConstant "()Ljava/lang/String;" + 202: StringConstant #203 // "finally" + 203: Utf8StringConstant "finally" + 204: TypeInfo #205 // java/lang/RuntimeException + 205: Utf8StringConstant "java/lang/RuntimeException" + 206: Utf8StringConstant "exception" + 207: Utf8StringConstant "Ljava/lang/RuntimeException;" + 208: TypeInfo #209 // java/lang/Throwable + 209: Utf8StringConstant "java/lang/Throwable" + 210: Utf8StringConstant "tryWithResources" + 211: Utf8StringConstant "(Ljava/nio/file/Path;)V" + 212: MethodReference #213.#215 // java/nio/file/Files.newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader; + 213: TypeInfo #214 // java/nio/file/Files + 214: Utf8StringConstant "java/nio/file/Files" + 215: NameAndTypeDescriptor #216.#217 // newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader; + 216: Utf8StringConstant "newBufferedReader" + 217: Utf8StringConstant "(Ljava/nio/file/Path;)Ljava/io/BufferedReader;" + 218: MethodReference #219.#221 // java/io/BufferedReader.readLine:()Ljava/lang/String; + 219: TypeInfo #220 // java/io/BufferedReader + 220: Utf8StringConstant "java/io/BufferedReader" + 221: NameAndTypeDescriptor #222.#201 // readLine:()Ljava/lang/String; + 222: Utf8StringConstant "readLine" + 223: MethodReference #219.#224 // java/io/BufferedReader.close:()V + 224: NameAndTypeDescriptor #225.#29 // close:()V + 225: Utf8StringConstant "close" + 226: MethodReference #208.#227 // java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V + 227: NameAndTypeDescriptor #228.#229 // addSuppressed:(Ljava/lang/Throwable;)V + 228: Utf8StringConstant "addSuppressed" + 229: Utf8StringConstant "(Ljava/lang/Throwable;)V" + 230: MethodReference #231.#233 // java/io/IOException.getMessage:()Ljava/lang/String; + 231: TypeInfo #232 // java/io/IOException + 232: Utf8StringConstant "java/io/IOException" + 233: NameAndTypeDescriptor #234.#201 // getMessage:()Ljava/lang/String; + 234: Utf8StringConstant "getMessage" + 235: Utf8StringConstant "path" + 236: Utf8StringConstant "Ljava/nio/file/Path;" + 237: Utf8StringConstant "line" + 238: Utf8StringConstant "Ljava/lang/String;" + 239: Utf8StringConstant "br" + 240: Utf8StringConstant "Ljava/io/BufferedReader;" + 241: Utf8StringConstant "Ljava/io/IOException;" + 242: TypeInfo #243 // java/nio/file/Path + 243: Utf8StringConstant "java/nio/file/Path" + 244: Utf8StringConstant "assertions" + 245: Utf8StringConstant "(I)V" + 246: TypeInfo #247 // java/lang/AssertionError + 247: Utf8StringConstant "java/lang/AssertionError" + 248: StringConstant #249 // "negative" + 249: Utf8StringConstant "negative" + 250: MethodReference #246.#251 // java/lang/AssertionError.:(Ljava/lang/Object;)V + 251: NameAndTypeDescriptor #45.#252 // :(Ljava/lang/Object;)V + 252: Utf8StringConstant "(Ljava/lang/Object;)V" + 253: Utf8StringConstant "value" + 254: Utf8StringConstant "boxingAndNumbers" + 255: MethodReference #256.#258 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 256: TypeInfo #257 // java/lang/Integer + 257: Utf8StringConstant "java/lang/Integer" + 258: NameAndTypeDescriptor #259.#260 // valueOf:(I)Ljava/lang/Integer; + 259: Utf8StringConstant "valueOf" + 260: Utf8StringConstant "(I)Ljava/lang/Integer;" + 261: MethodReference #256.#262 // java/lang/Integer.intValue:()I + 262: NameAndTypeDescriptor #263.#79 // intValue:()I + 263: Utf8StringConstant "intValue" + 264: MethodReference #265.#267 // java/math/BigDecimal.valueOf:(J)Ljava/math/BigDecimal; + 265: TypeInfo #266 // java/math/BigDecimal + 266: Utf8StringConstant "java/math/BigDecimal" + 267: NameAndTypeDescriptor #259.#268 // valueOf:(J)Ljava/math/BigDecimal; + 268: Utf8StringConstant "(J)Ljava/math/BigDecimal;" + 269: MethodReference #265.#270 // java/math/BigDecimal.toPlainString:()Ljava/lang/String; + 270: NameAndTypeDescriptor #271.#201 // toPlainString:()Ljava/lang/String; + 271: Utf8StringConstant "toPlainString" + 272: Utf8StringConstant "boxed" + 273: Utf8StringConstant "Ljava/lang/Integer;" + 274: Utf8StringConstant "primitive" + 275: Utf8StringConstant "decimal" + 276: Utf8StringConstant "Ljava/math/BigDecimal;" + 277: Utf8StringConstant "instanceofPattern" + 278: MethodReference #148.#279 // java/lang/String.isEmpty:()Z + 279: NameAndTypeDescriptor #280.#36 // isEmpty:()Z + 280: Utf8StringConstant "isEmpty" + 281: Utf8StringConstant "object" + 282: Utf8StringConstant "Ljava/lang/Object;" + 283: Utf8StringConstant "text" + 284: Utf8StringConstant "enumSwitch" + 285: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Day;)V" + 286: MethodReference #1.#287 // demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:()[I + 287: NameAndTypeDescriptor #26.#288 // $SWITCH_TABLE$demo$AllJavaSyntaxes$Day:()[I + 288: Utf8StringConstant "()[I" + 289: MethodReference #290.#292 // demo/AllJavaSyntaxes$Day.ordinal:()I + 290: TypeInfo #291 // demo/AllJavaSyntaxes$Day + 291: Utf8StringConstant "demo/AllJavaSyntaxes$Day" + 292: NameAndTypeDescriptor #293.#79 // ordinal:()I + 293: Utf8StringConstant "ordinal" + 294: StringConstant #295 // "weekday" + 295: Utf8StringConstant "weekday" + 296: StringConstant #297 // "other" + 297: Utf8StringConstant "other" + 298: Utf8StringConstant "day" + 299: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Day;" + 300: Utf8StringConstant "expressionSwitch" + 301: Utf8StringConstant "(I)Ljava/lang/String;" + 302: StringConstant #303 // "zero" + 303: Utf8StringConstant "zero" + 304: StringConstant #305 // "one" + 305: Utf8StringConstant "one" + 306: TypeInfo #307 // java/lang/IllegalArgumentException + 307: Utf8StringConstant "java/lang/IllegalArgumentException" + 308: MethodReference #306.#44 // java/lang/IllegalArgumentException.:()V + 309: Utf8StringConstant "compareTo" + 310: Utf8StringConstant "(Ljava/lang/Comparable;)I" + 311: Utf8StringConstant "(TE;)I" + 312: InterfaceMethodReference #313.#315 // java/util/Comparator.naturalOrder:()Ljava/util/Comparator; + 313: TypeInfo #314 // java/util/Comparator + 314: Utf8StringConstant "java/util/Comparator" + 315: NameAndTypeDescriptor #316.#177 // naturalOrder:()Ljava/util/Comparator; + 316: Utf8StringConstant "naturalOrder" + 317: InterfaceMethodReference #313.#318 // java/util/Comparator.compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 318: NameAndTypeDescriptor #176.#319 // compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 319: Utf8StringConstant "(Ljava/lang/Object;Ljava/lang/Object;)I" + 320: Utf8StringConstant "Ljava/lang/Comparable;" + 321: Utf8StringConstant "TE;" + 322: Utf8StringConstant "hashCode" + 323: MethodReference #3.#324 // java/util/ArrayList.hashCode:()I + 324: NameAndTypeDescriptor #322.#79 // hashCode:()I + 325: MethodReference #326.#328 // java/util/Objects.hash:([Ljava/lang/Object;)I + 326: TypeInfo #327 // java/util/Objects + 327: Utf8StringConstant "java/util/Objects" + 328: NameAndTypeDescriptor #329.#330 // hash:([Ljava/lang/Object;)I + 329: Utf8StringConstant "hash" + 330: Utf8StringConstant "([Ljava/lang/Object;)I" + 331: Utf8StringConstant "equals" + 332: Utf8StringConstant "(Ljava/lang/Object;)Z" + 333: MethodReference #3.#334 // java/util/ArrayList.equals:(Ljava/lang/Object;)Z + 334: NameAndTypeDescriptor #331.#332 // equals:(Ljava/lang/Object;)Z + 335: Utf8StringConstant "intersectionBound" + 336: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Named;)Ldemo/AllJavaSyntaxes$Named;" + 337: Utf8StringConstant ";>(TT;)TT;" + 338: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Named;" + 339: Utf8StringConstant "TT;" + 340: Utf8StringConstant "intersectionCast" + 341: TypeInfo #342 // demo/AllJavaSyntaxes$Identified + 342: Utf8StringConstant "demo/AllJavaSyntaxes$Identified" + 343: TypeInfo #344 // demo/AllJavaSyntaxes$Named + 344: Utf8StringConstant "demo/AllJavaSyntaxes$Named" + 345: InterfaceMethodReference #343.#346 // demo/AllJavaSyntaxes$Named.name:()Ljava/lang/String; + 346: NameAndTypeDescriptor #347.#201 // name:()Ljava/lang/String; + 347: Utf8StringConstant "name" + 348: Utf8StringConstant "guardedPattern" + 349: MethodReference #326.#350 // java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 350: NameAndTypeDescriptor #351.#352 // requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 351: Utf8StringConstant "requireNonNull" + 352: Utf8StringConstant "(Ljava/lang/Object;)Ljava/lang/Object;" + 353: InvokeDynamicInfo 9, #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 354: NameAndTypeDescriptor #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 355: Utf8StringConstant "typeSwitch" + 356: Utf8StringConstant "(Ljava/lang/Object;I)I" + 357: MethodReference #148.#358 // java/lang/String.length:()I + 358: NameAndTypeDescriptor #359.#79 // length:()I + 359: Utf8StringConstant "length" + 360: Utf8StringConstant "s" + 361: Utf8StringConstant "sealedSwitch" + 362: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Shape;)D" + 363: InvokeDynamicInfo 10, #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 364: TypeInfo #365 // demo/AllJavaSyntaxes$Circle + 365: Utf8StringConstant "demo/AllJavaSyntaxes$Circle" + 366: MethodReference #364.#367 // demo/AllJavaSyntaxes$Circle.area:()D + 367: NameAndTypeDescriptor #368.#369 // area:()D + 368: Utf8StringConstant "area" + 369: Utf8StringConstant "()D" + 370: TypeInfo #371 // demo/AllJavaSyntaxes$Rectangle + 371: Utf8StringConstant "demo/AllJavaSyntaxes$Rectangle" + 372: MethodReference #370.#367 // demo/AllJavaSyntaxes$Rectangle.area:()D + 373: TypeInfo #374 // java/lang/MatchException + 374: Utf8StringConstant "java/lang/MatchException" + 375: MethodReference #373.#376 // java/lang/MatchException.:(Ljava/lang/String;Ljava/lang/Throwable;)V + 376: NameAndTypeDescriptor #45.#377 // :(Ljava/lang/String;Ljava/lang/Throwable;)V + 377: Utf8StringConstant "(Ljava/lang/String;Ljava/lang/Throwable;)V" + 378: Utf8StringConstant "shape" + 379: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Shape;" + 380: Utf8StringConstant "circle" + 381: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Circle;" + 382: Utf8StringConstant "rectangle" + 383: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Rectangle;" + 384: TypeInfo #385 // demo/AllJavaSyntaxes$Shape + 385: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 386: Utf8StringConstant "handleResult" + 387: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Result;)Ljava/lang/String;" + 388: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Result;)Ljava/lang/String;" + 389: InvokeDynamicInfo 11, #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 390: TypeInfo #391 // demo/AllJavaSyntaxes$Success + 391: Utf8StringConstant "demo/AllJavaSyntaxes$Success" + 392: MethodReference #390.#393 // demo/AllJavaSyntaxes$Success.value:()Ljava/lang/Object; + 393: NameAndTypeDescriptor #253.#147 // value:()Ljava/lang/Object; + 394: MethodReference #148.#395 // java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 395: NameAndTypeDescriptor #259.#396 // valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 396: Utf8StringConstant "(Ljava/lang/Object;)Ljava/lang/String;" + 397: InvokeDynamicInfo 12, #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 398: NameAndTypeDescriptor #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 399: Utf8StringConstant "makeConcatWithConstants" + 400: Utf8StringConstant "(Ljava/lang/String;)Ljava/lang/String;" + 401: TypeInfo #402 // demo/AllJavaSyntaxes$Failure + 402: Utf8StringConstant "demo/AllJavaSyntaxes$Failure" + 403: MethodReference #401.#404 // demo/AllJavaSyntaxes$Failure.exception:()Ljava/lang/Exception; + 404: NameAndTypeDescriptor #206.#405 // exception:()Ljava/lang/Exception; + 405: Utf8StringConstant "()Ljava/lang/Exception;" + 406: InvokeDynamicInfo 13, #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 407: Utf8StringConstant "result" + 408: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 409: Utf8StringConstant "success" + 410: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 411: Utf8StringConstant "failure" + 412: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 413: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 414: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 415: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 416: TypeInfo #417 // demo/AllJavaSyntaxes$Result + 417: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 418: Utf8StringConstant "genericMethod" + 419: Utf8StringConstant "(TT;)TT;" + 420: Utf8StringConstant "labeledLoops" + 421: Utf8StringConstant "i" + 422: Utf8StringConstant "j" + 423: Utf8StringConstant "labeledBlock" + 424: StringConstant #425 // "unreachable" + 425: Utf8StringConstant "unreachable" + 426: Utf8StringConstant "localVar" + 427: StringConstant #283 // "text" + 428: MethodReference #3.#429 // java/util/ArrayList.size:()I + 429: NameAndTypeDescriptor #430.#79 // size:()I + 430: Utf8StringConstant "size" + 431: InvokeDynamicInfo 14, #399.#433 // makeConcatWithConstants:(Ljava/lang/String;II)Ljava/lang/String; + 432: NameAndTypeDescriptor #399.#433 // makeConcatWithConstants:(Ljava/lang/String;II)Ljava/lang/String; + 433: Utf8StringConstant "(Ljava/lang/String;II)Ljava/lang/String;" + 434: Utf8StringConstant "number" + 435: Utf8StringConstant "Ljava/util/ArrayList;" + 436: Utf8StringConstant "Ljava/util/ArrayList;" + 437: Utf8StringConstant "multiCatch" + 438: Utf8StringConstant "Exceptions" + 439: TypeInfo #440 // java/lang/Exception + 440: Utf8StringConstant "java/lang/Exception" + 441: MethodReference #231.#44 // java/io/IOException.:()V + 442: Utf8StringConstant "Ljava/lang/Exception;" + 443: Utf8StringConstant "suppressed" + 444: StringConstant #445 // "primary" + 445: Utf8StringConstant "primary" + 446: MethodReference #439.#447 // java/lang/Exception.:(Ljava/lang/String;)V + 447: NameAndTypeDescriptor #45.#132 // :(Ljava/lang/String;)V + 448: StringConstant #449 // "secondary" + 449: Utf8StringConstant "secondary" + 450: MethodReference #439.#227 // java/lang/Exception.addSuppressed:(Ljava/lang/Throwable;)V + 451: Utf8StringConstant "throwExpression" + 452: Utf8StringConstant "(Ljava/lang/Integer;)Ljava/lang/String;" + 453: InvokeDynamicInfo 15, #112.#113 // apply:()Ljava/util/function/Function; + 454: InvokeDynamicInfo 16, #140.#141 // get:()Ljava/util/function/Supplier; + 455: MethodReference #151.#456 // java/util/Optional.orElseThrow:(Ljava/util/function/Supplier;)Ljava/lang/Object; + 456: NameAndTypeDescriptor #457.#458 // orElseThrow:(Ljava/util/function/Supplier;)Ljava/lang/Object; + 457: Utf8StringConstant "orElseThrow" + 458: Utf8StringConstant "(Ljava/util/function/Supplier;)Ljava/lang/Object;" + 459: Utf8StringConstant "synchronizedBlock" + 460: StringConstant #461 // "sync" + 461: Utf8StringConstant "sync" + 462: Utf8StringConstant "localClass" + 463: TypeInfo #464 // demo/AllJavaSyntaxes$1Local + 464: Utf8StringConstant "demo/AllJavaSyntaxes$1Local" + 465: MethodReference #463.#466 // demo/AllJavaSyntaxes$1Local.:(Ldemo/AllJavaSyntaxes;)V + 466: NameAndTypeDescriptor #45.#467 // :(Ldemo/AllJavaSyntaxes;)V + 467: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 468: MethodReference #463.#469 // demo/AllJavaSyntaxes$1Local.value:()Ljava/lang/String; + 469: NameAndTypeDescriptor #253.#201 // value:()Ljava/lang/String; + 470: Utf8StringConstant "intersectionThrows" + 471: Utf8StringConstant "()V^TT;" + 472: Utf8StringConstant "wildcard" + 473: Utf8StringConstant "(Ljava/util/List<*>;)V" + 474: MethodReference #1.#475 // demo/AllJavaSyntaxes.capture:(Ljava/util/List;)V + 475: NameAndTypeDescriptor #476.#172 // capture:(Ljava/util/List;)V + 476: Utf8StringConstant "capture" + 477: Utf8StringConstant "Ljava/util/List<*>;" + 478: Utf8StringConstant "(Ljava/util/List;)V" + 479: InterfaceMethodReference #179.#480 // java/util/List.iterator:()Ljava/util/Iterator; + 480: NameAndTypeDescriptor #481.#482 // iterator:()Ljava/util/Iterator; + 481: Utf8StringConstant "iterator" + 482: Utf8StringConstant "()Ljava/util/Iterator;" + 483: InterfaceMethodReference #484.#486 // java/util/Iterator.next:()Ljava/lang/Object; + 484: TypeInfo #485 // java/util/Iterator + 485: Utf8StringConstant "java/util/Iterator" + 486: NameAndTypeDescriptor #487.#147 // next:()Ljava/lang/Object; + 487: Utf8StringConstant "next" + 488: InterfaceMethodReference #484.#489 // java/util/Iterator.hasNext:()Z + 489: NameAndTypeDescriptor #490.#36 // hasNext:()Z + 490: Utf8StringConstant "hasNext" + 491: Utf8StringConstant "element" + 492: Utf8StringConstant "Ljava/util/List;" + 493: Utf8StringConstant "typeUse" + 494: StringConstant #53 // "x" + 495: InterfaceMethodReference #179.#496 // java/util/List.of:(Ljava/lang/Object;)Ljava/util/List; + 496: NameAndTypeDescriptor #88.#497 // of:(Ljava/lang/Object;)Ljava/util/List; + 497: Utf8StringConstant "(Ljava/lang/Object;)Ljava/util/List;" + 498: InterfaceMethodReference #179.#499 // java/util/List.get:(I)Ljava/lang/Object; + 499: NameAndTypeDescriptor #140.#500 // get:(I)Ljava/lang/Object; + 500: Utf8StringConstant "(I)Ljava/lang/Object;" + 501: Utf8StringConstant "RuntimeInvisibleTypeAnnotations" + 502: Utf8StringConstant "Ldemo/AllJavaSyntaxes$TypeUse;" + 503: Utf8StringConstant "arrays" + 504: TypeInfo #133 // [Ljava/lang/String; + 505: StringConstant #506 // "a" + 506: Utf8StringConstant "a" + 507: StringConstant #508 // "b" + 508: Utf8StringConstant "b" + 509: TypeInfo #27 // [I + 510: Utf8StringConstant "literals" + 511: LongConstant 1000000L + 513: DoubleConstant 1000.0 + 515: InvokeDynamicInfo 17, #399.#517 // makeConcatWithConstants:(IIJFDC)Ljava/lang/String; + 516: NameAndTypeDescriptor #399.#517 // makeConcatWithConstants:(IIJFDC)Ljava/lang/String; + 517: Utf8StringConstant "(IIJFDC)Ljava/lang/String;" + 518: Utf8StringConstant "bin" + 519: Utf8StringConstant "hex" + 520: Utf8StringConstant "underscore" + 521: Utf8StringConstant "f" + 522: Utf8StringConstant "F" + 523: Utf8StringConstant "d" + 524: Utf8StringConstant "D" + 525: Utf8StringConstant "ch" + 526: Utf8StringConstant "C" + 527: Utf8StringConstant "textBlock" + 528: StringConstant #529 // "line1\nline2\n" + 529: Utf8StringConstant "line1\nline2\n" + 530: Utf8StringConstant "switchYield" + 531: Utf8StringConstant "(I)I" + 532: Utf8StringConstant "allOperators" + 533: MethodReference #97.#44 // java/lang/Object.:()V + 534: MethodReference #148.#535 // java/lang/String.valueOf:(I)Ljava/lang/String; + 535: NameAndTypeDescriptor #259.#301 // valueOf:(I)Ljava/lang/String; + 536: InvokeDynamicInfo 18, #140.#141 // get:()Ljava/util/function/Supplier; + 537: StringConstant #64 // "this" + 538: InvokeDynamicInfo 19, #176.#177 // compare:()Ljava/util/Comparator; + 539: TypeInfo #540 // [[I + 540: Utf8StringConstant "[[I" + 541: InvokeDynamicInfo 20, #543.#544 // run:(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable; + 542: NameAndTypeDescriptor #543.#544 // run:(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable; + 543: Utf8StringConstant "run" + 544: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable;" + 545: InvokeDynamicInfo 21, #140.#141 // get:()Ljava/util/function/Supplier; + 546: MethodReference #246.#44 // java/lang/AssertionError.:()V + 547: MethodReference #204.#44 // java/lang/RuntimeException.:()V + 548: InvokeDynamicInfo 22, #399.#550 // makeConcatWithConstants:(II)Ljava/lang/String; + 549: NameAndTypeDescriptor #399.#550 // makeConcatWithConstants:(II)Ljava/lang/String; + 550: Utf8StringConstant "(II)Ljava/lang/String;" + 551: Utf8StringConstant "widened" + 552: Utf8StringConstant "array" + 553: Utf8StringConstant "matrix" + 554: Utf8StringConstant "yielded" + 555: Utf8StringConstant "qualifiedNew" + 556: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)V" + 557: Utf8StringConstant "(Ldemo/AllJavaSyntaxes.Outer;)V" + 558: TypeInfo #559 // demo/AllJavaSyntaxes$Outer$Inner + 559: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 560: MethodReference #558.#561 // demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 561: NameAndTypeDescriptor #45.#556 // :(Ldemo/AllJavaSyntaxes$Outer;)V + 562: TypeInfo #563 // demo/AllJavaSyntaxes$Outer$Inner$Deep + 563: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner$Deep" + 564: MethodReference #562.#565 // demo/AllJavaSyntaxes$Outer$Inner$Deep.:(Ldemo/AllJavaSyntaxes$Outer$Inner;)V + 565: NameAndTypeDescriptor #45.#566 // :(Ldemo/AllJavaSyntaxes$Outer$Inner;)V + 566: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)V" + 567: TypeInfo #568 // demo/AllJavaSyntaxes$Outer + 568: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 569: MethodReference #567.#466 // demo/AllJavaSyntaxes$Outer.:(Ldemo/AllJavaSyntaxes;)V + 570: TypeInfo #571 // demo/AllJavaSyntaxes$1 + 571: Utf8StringConstant "demo/AllJavaSyntaxes$1" + 572: MethodReference #570.#573 // demo/AllJavaSyntaxes$1.:(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V + 573: NameAndTypeDescriptor #45.#574 // :(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V + 574: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V" + 575: TypeInfo #576 // demo/AllJavaSyntaxes$Outer$StaticNested + 576: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$StaticNested" + 577: MethodReference #575.#44 // demo/AllJavaSyntaxes$Outer$StaticNested.:()V + 578: Utf8StringConstant "outer" + 579: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer;" + 580: Utf8StringConstant "Ldemo/AllJavaSyntaxes.Outer;" + 581: Utf8StringConstant "receiverParameter" + 582: StringConstant #583 // "receiver" + 583: Utf8StringConstant "receiver" + 584: Utf8StringConstant "diamondAnonymous" + 585: TypeInfo #586 // demo/AllJavaSyntaxes$2 + 586: Utf8StringConstant "demo/AllJavaSyntaxes$2" + 587: MethodReference #585.#466 // demo/AllJavaSyntaxes$2.:(Ldemo/AllJavaSyntaxes;)V + 588: Utf8StringConstant "c" + 589: Utf8StringConstant "Ljava/util/Comparator;" + 590: Utf8StringConstant "Ljava/util/Comparator;" + 591: Utf8StringConstant "emptyStatement" + 592: Utf8StringConstant "(Z)V" + 593: Utf8StringConstant "flag" + 594: Utf8StringConstant "multiDimVarargs" + 595: Utf8StringConstant "([[I)V" + 596: Utf8StringConstant "values" + 597: Utf8StringConstant "strict" + 598: Utf8StringConstant "(DD)D" + 599: Utf8StringConstant "chainedAssignment" + 600: Utf8StringConstant "parameterAnnotation" + 601: Utf8StringConstant "RuntimeVisibleParameterAnnotations" + 602: Utf8StringConstant "(Ljava/lang/Object;)I" + 603: MethodReference #1.#604 // demo/AllJavaSyntaxes.compareTo:(Ljava/lang/Comparable;)I + 604: NameAndTypeDescriptor #309.#310 // compareTo:(Ljava/lang/Comparable;)I + 605: FieldReference #1.#606 // demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 606: NameAndTypeDescriptor #26.#27 // $SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 607: MethodReference #290.#608 // demo/AllJavaSyntaxes$Day.values:()[Ldemo/AllJavaSyntaxes$Day; + 608: NameAndTypeDescriptor #596.#609 // values:()[Ldemo/AllJavaSyntaxes$Day; + 609: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Day;" + 610: FieldReference #290.#611 // demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 611: NameAndTypeDescriptor #612.#299 // FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 612: Utf8StringConstant "FRIDAY" + 613: FieldReference #290.#614 // demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 614: NameAndTypeDescriptor #615.#299 // MONDAY:Ldemo/AllJavaSyntaxes$Day; + 615: Utf8StringConstant "MONDAY" + 616: FieldReference #290.#617 // demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 617: NameAndTypeDescriptor #618.#299 // SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 618: Utf8StringConstant "SATURDAY" + 619: FieldReference #290.#620 // demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 620: NameAndTypeDescriptor #621.#299 // SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 621: Utf8StringConstant "SUNDAY" + 622: FieldReference #290.#623 // demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 623: NameAndTypeDescriptor #624.#299 // THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 624: Utf8StringConstant "THURSDAY" + 625: FieldReference #290.#626 // demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 626: NameAndTypeDescriptor #627.#299 // TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 627: Utf8StringConstant "TUESDAY" + 628: FieldReference #290.#629 // demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 629: NameAndTypeDescriptor #630.#299 // WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 630: Utf8StringConstant "WEDNESDAY" + 631: TypeInfo #632 // java/lang/NoSuchFieldError + 632: Utf8StringConstant "java/lang/NoSuchFieldError" + 633: Utf8StringConstant "lambda$0" + 634: StringConstant #20 // "callable" + 635: Utf8StringConstant "lambda$3" + 636: Utf8StringConstant "(I)[Ljava/lang/Object;" + 637: Utf8StringConstant "lambda$4" + 638: StringConstant #253 // "value" + 639: Utf8StringConstant "lambda$6" + 640: Utf8StringConstant "(Ljava/lang/Integer;)V" + 641: InvokeDynamicInfo 23, #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 642: Utf8StringConstant "lambda$7" + 643: Utf8StringConstant "(Ljava/lang/String;Ljava/lang/String;)I" + 644: MethodReference #148.#645 // java/lang/String.compareTo:(Ljava/lang/String;)I + 645: NameAndTypeDescriptor #309.#646 // compareTo:(Ljava/lang/String;)I + 646: Utf8StringConstant "(Ljava/lang/String;)I" + 647: Utf8StringConstant "lambda$8" + 648: Utf8StringConstant "lambda$10" + 649: Utf8StringConstant "()Ljava/lang/IllegalArgumentException;" + 650: Utf8StringConstant "lambda$12" + 651: Utf8StringConstant "()Ljava/lang/Integer;" + 652: Utf8StringConstant "lambda$14" + 653: StringConstant #543 // "run" + 654: Utf8StringConstant "SourceFile" + 655: Utf8StringConstant "AllJavaSyntaxes.java" + 656: Utf8StringConstant ";>Ljava/util/ArrayList;Ljava/io/Serializable;Ljava/lang/Comparable;Ljava/lang/Iterable;" + 657: Utf8StringConstant "BootstrapMethods" + 658: MethodReference #659.#661 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 659: TypeInfo #660 // java/lang/invoke/LambdaMetafactory + 660: Utf8StringConstant "java/lang/invoke/LambdaMetafactory" + 661: NameAndTypeDescriptor #662.#663 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 662: Utf8StringConstant "metafactory" + 663: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" + 664: MethodHandle InvokeStatic #659.#661 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 665: MethodType ()Ljava/lang/Object; + 666: MethodReference #1.#667 // demo/AllJavaSyntaxes.lambda$0:()Ljava/lang/String; + 667: NameAndTypeDescriptor #633.#201 // lambda$0:()Ljava/lang/String; + 668: MethodHandle InvokeStatic #1.#667 // demo/AllJavaSyntaxes.lambda$0:()Ljava/lang/String; + 669: MethodType ()Ljava/lang/String; + 670: MethodType (Ljava/lang/Object;)V + 671: MethodReference #672.#674 // java/io/PrintStream.println:(Ljava/lang/Object;)V + 672: TypeInfo #673 // java/io/PrintStream + 673: Utf8StringConstant "java/io/PrintStream" + 674: NameAndTypeDescriptor #675.#252 // println:(Ljava/lang/Object;)V + 675: Utf8StringConstant "println" + 676: MethodHandle InvokeVirtual #672.#674 // java/io/PrintStream.println:(Ljava/lang/Object;)V + 677: MethodType (Ljava/lang/Object;)V + 678: MethodType (Ljava/lang/Object;)Ljava/lang/Object; + 679: MethodReference #97.#680 // java/lang/Object.toString:()Ljava/lang/String; + 680: NameAndTypeDescriptor #681.#201 // toString:()Ljava/lang/String; + 681: Utf8StringConstant "toString" + 682: MethodHandle InvokeVirtual #97.#680 // java/lang/Object.toString:()Ljava/lang/String; + 683: MethodType (Ljava/lang/Object;)Ljava/lang/String; + 684: MethodType (I)Ljava/lang/Object; + 685: MethodReference #1.#686 // demo/AllJavaSyntaxes.lambda$3:(I)[Ljava/lang/Object; + 686: NameAndTypeDescriptor #635.#636 // lambda$3:(I)[Ljava/lang/Object; + 687: MethodHandle InvokeStatic #1.#686 // demo/AllJavaSyntaxes.lambda$3:(I)[Ljava/lang/Object; + 688: MethodType (I)[Ljava/lang/Object; + 689: MethodType ()Ljava/lang/Object; + 690: MethodReference #1.#691 // demo/AllJavaSyntaxes.lambda$4:()Ljava/lang/String; + 691: NameAndTypeDescriptor #637.#201 // lambda$4:()Ljava/lang/String; + 692: MethodHandle InvokeStatic #1.#691 // demo/AllJavaSyntaxes.lambda$4:()Ljava/lang/String; + 693: MethodType ()Ljava/lang/String; + 694: MethodType (Ljava/lang/Object;)Ljava/lang/Object; + 695: MethodHandle InvokeVirtual #148.#358 // java/lang/String.length:()I + 696: Utf8StringConstant "(Ljava/lang/String;)Ljava/lang/Integer;" + 697: MethodType (Ljava/lang/String;)Ljava/lang/Integer; + 698: MethodType (Ljava/lang/Object;)V + 699: MethodReference #1.#700 // demo/AllJavaSyntaxes.lambda$6:(Ljava/lang/Integer;)V + 700: NameAndTypeDescriptor #639.#640 // lambda$6:(Ljava/lang/Integer;)V + 701: MethodHandle InvokeSpecial #1.#700 // demo/AllJavaSyntaxes.lambda$6:(Ljava/lang/Integer;)V + 702: MethodType (Ljava/lang/Integer;)V + 703: MethodType (Ljava/lang/Object;Ljava/lang/Object;)I + 704: MethodReference #1.#705 // demo/AllJavaSyntaxes.lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + 705: NameAndTypeDescriptor #642.#643 // lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + 706: MethodHandle InvokeStatic #1.#705 // demo/AllJavaSyntaxes.lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + 707: MethodType (Ljava/lang/String;Ljava/lang/String;)I + 708: MethodType (Ljava/lang/Object;Ljava/lang/Object;)I + 709: MethodReference #1.#710 // demo/AllJavaSyntaxes.lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + 710: NameAndTypeDescriptor #647.#643 // lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + 711: MethodHandle InvokeStatic #1.#710 // demo/AllJavaSyntaxes.lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + 712: MethodType (Ljava/lang/String;Ljava/lang/String;)I + 713: MethodReference #714.#716 // java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 714: TypeInfo #715 // java/lang/runtime/SwitchBootstraps + 715: Utf8StringConstant "java/lang/runtime/SwitchBootstraps" + 716: NameAndTypeDescriptor #355.#717 // typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 717: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" + 718: MethodHandle InvokeStatic #714.#716 // java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 719: MethodReference #720.#722 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 720: TypeInfo #721 // java/lang/invoke/StringConcatFactory + 721: Utf8StringConstant "java/lang/invoke/StringConcatFactory" + 722: NameAndTypeDescriptor #399.#723 // makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 723: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" + 724: MethodHandle InvokeStatic #720.#722 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 725: StringConstant #726 // "success:\u0001" + 726: Utf8StringConstant "success:\u0001" + 727: StringConstant #728 // "failure:\u0001" + 728: Utf8StringConstant "failure:\u0001" + 729: StringConstant #730 // "\u0001\u0001\u0001" + 730: Utf8StringConstant "\u0001\u0001\u0001" + 731: MethodType (Ljava/lang/Object;)Ljava/lang/Object; + 732: MethodHandle InvokeVirtual #97.#680 // java/lang/Object.toString:()Ljava/lang/String; + 733: MethodType (Ljava/lang/Integer;)Ljava/lang/String; + 734: MethodType ()Ljava/lang/Object; + 735: MethodReference #1.#736 // demo/AllJavaSyntaxes.lambda$10:()Ljava/lang/IllegalArgumentException; + 736: NameAndTypeDescriptor #648.#649 // lambda$10:()Ljava/lang/IllegalArgumentException; + 737: MethodHandle InvokeStatic #1.#736 // demo/AllJavaSyntaxes.lambda$10:()Ljava/lang/IllegalArgumentException; + 738: MethodType ()Ljava/lang/IllegalArgumentException; + 739: StringConstant #740 // "\u0001\u0001\u0001\u0001\u0001\u0001" + 740: Utf8StringConstant "\u0001\u0001\u0001\u0001\u0001\u0001" + 741: MethodType ()Ljava/lang/Object; + 742: MethodReference #1.#743 // demo/AllJavaSyntaxes.lambda$12:()Ljava/lang/Integer; + 743: NameAndTypeDescriptor #650.#651 // lambda$12:()Ljava/lang/Integer; + 744: MethodHandle InvokeStatic #1.#743 // demo/AllJavaSyntaxes.lambda$12:()Ljava/lang/Integer; + 745: MethodType ()Ljava/lang/Integer; + 746: MethodType (Ljava/lang/Object;Ljava/lang/Object;)I + 747: MethodHandle InvokeVirtual #148.#645 // java/lang/String.compareTo:(Ljava/lang/String;)I + 748: MethodType (Ljava/lang/String;Ljava/lang/String;)I + 749: MethodType ()V + 750: MethodReference #1.#751 // demo/AllJavaSyntaxes.lambda$14:()V + 751: NameAndTypeDescriptor #652.#29 // lambda$14:()V + 752: MethodHandle InvokeSpecial #1.#751 // demo/AllJavaSyntaxes.lambda$14:()V + 753: MethodType ()V + 754: MethodType ()Ljava/lang/Object; + 755: MethodHandle NewInvokeSpecial #3.#44 // java/util/ArrayList.:()V + 756: Utf8StringConstant "()Ljava/util/ArrayList;" + 757: MethodType ()Ljava/util/ArrayList; + 758: StringConstant #759 // "\u0001:\u0001" + 759: Utf8StringConstant "\u0001:\u0001" + 760: StringConstant #761 // "length=\u0001" + 761: Utf8StringConstant "length=\u0001" + 762: Utf8StringConstant "InnerClasses" + 763: Utf8StringConstant "Local" + 764: TypeInfo #765 // demo/AllJavaSyntaxes$AdvancedInterface + 765: Utf8StringConstant "demo/AllJavaSyntaxes$AdvancedInterface" + 766: Utf8StringConstant "AdvancedInterface" + 767: TypeInfo #768 // demo/AllJavaSyntaxes$Base + 768: Utf8StringConstant "demo/AllJavaSyntaxes$Base" + 769: Utf8StringConstant "Base" + 770: Utf8StringConstant "Circle" + 771: Utf8StringConstant "Day" + 772: TypeInfo #773 // demo/AllJavaSyntaxes$Derived + 773: Utf8StringConstant "demo/AllJavaSyntaxes$Derived" + 774: Utf8StringConstant "Derived" + 775: TypeInfo #776 // demo/AllJavaSyntaxes$Entity + 776: Utf8StringConstant "demo/AllJavaSyntaxes$Entity" + 777: Utf8StringConstant "Entity" + 778: Utf8StringConstant "Failure" + 779: TypeInfo #780 // demo/AllJavaSyntaxes$GenericConstructor + 780: Utf8StringConstant "demo/AllJavaSyntaxes$GenericConstructor" + 781: Utf8StringConstant "GenericConstructor" + 782: Utf8StringConstant "Identified" + 783: TypeInfo #784 // demo/AllJavaSyntaxes$Inner + 784: Utf8StringConstant "demo/AllJavaSyntaxes$Inner" + 785: Utf8StringConstant "Inner" + 786: TypeInfo #787 // demo/AllJavaSyntaxes$Marker + 787: Utf8StringConstant "demo/AllJavaSyntaxes$Marker" + 788: Utf8StringConstant "Marker" + 789: Utf8StringConstant "Named" + 790: TypeInfo #791 // demo/AllJavaSyntaxes$Operation + 791: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 792: Utf8StringConstant "Operation" + 793: Utf8StringConstant "Outer" + 794: Utf8StringConstant "Deep" + 795: Utf8StringConstant "StaticNested" + 796: TypeInfo #797 // demo/AllJavaSyntaxes$Rec + 797: Utf8StringConstant "demo/AllJavaSyntaxes$Rec" + 798: Utf8StringConstant "Rec" + 799: Utf8StringConstant "Rectangle" + 800: Utf8StringConstant "Result" + 801: Utf8StringConstant "Shape" + 802: TypeInfo #803 // demo/AllJavaSyntaxes$StrictClass + 803: Utf8StringConstant "demo/AllJavaSyntaxes$StrictClass" + 804: Utf8StringConstant "StrictClass" + 805: Utf8StringConstant "Success" + 806: TypeInfo #807 // demo/AllJavaSyntaxes$SuperInner + 807: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner" + 808: Utf8StringConstant "SuperInner" + 809: TypeInfo #810 // demo/AllJavaSyntaxes$SuperOuter + 810: Utf8StringConstant "demo/AllJavaSyntaxes$SuperOuter" + 811: Utf8StringConstant "SuperOuter" + 812: TypeInfo #813 // demo/AllJavaSyntaxes$Tag + 813: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 814: Utf8StringConstant "Tag" + 815: TypeInfo #816 // demo/AllJavaSyntaxes$Tagged + 816: Utf8StringConstant "demo/AllJavaSyntaxes$Tagged" + 817: Utf8StringConstant "Tagged" + 818: TypeInfo #819 // demo/AllJavaSyntaxes$Tags + 819: Utf8StringConstant "demo/AllJavaSyntaxes$Tags" + 820: Utf8StringConstant "Tags" + 821: TypeInfo #822 // demo/AllJavaSyntaxes$TypeUse + 822: Utf8StringConstant "demo/AllJavaSyntaxes$TypeUse" + 823: Utf8StringConstant "TypeUse" + 824: TypeInfo #825 // demo/AllJavaSyntaxes$WithDefaults + 825: Utf8StringConstant "demo/AllJavaSyntaxes$WithDefaults" + 826: Utf8StringConstant "WithDefaults" + 827: TypeInfo #828 // java/lang/invoke/MethodHandles$Lookup + 828: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 829: TypeInfo #830 // java/lang/invoke/MethodHandles + 830: Utf8StringConstant "java/lang/invoke/MethodHandles" + 831: Utf8StringConstant "Lookup" + 832: Utf8StringConstant "NestMembers" + 833: TypeInfo #834 // demo/AllJavaSyntaxes$Inner$1 + 834: Utf8StringConstant "demo/AllJavaSyntaxes$Inner$1" + 835: TypeInfo #836 // demo/AllJavaSyntaxes$Operation$1 + 836: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$1" + 837: TypeInfo #838 // demo/AllJavaSyntaxes$Operation$2 + 838: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$2" + 839: TypeInfo #840 // demo/AllJavaSyntaxes$SuperInner$Deep + 840: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner$Deep" + private static final long serialVersionUID; + Flags: PRIVATE, STATIC, FINAL + ConstantValue: long 1L + private static transient volatile char[] CHARS; + Flags: PRIVATE, STATIC, TRANSIENT, VOLATILE + private static final java.util.concurrent.atomic.AtomicInteger COUNTER; + Flags: PRIVATE, STATIC, FINAL + transient java.util.concurrent.Callable callable; + Flags: TRANSIENT + Signature: Ljava/util/concurrent/Callable; + static final boolean $assertionsDisabled; + Flags: STATIC, FINAL, SYNTHETIC + private static volatile int[] $SWITCH_TABLE$demo$AllJavaSyntaxes$Day; + Flags: PRIVATE, STATIC, VOLATILE, SYNTHETIC + static {}; + Flags: STATIC + Code: + stack=4, locals=2, arguments=0 + 0: ldc Ldemo/AllJavaSyntaxes;.class + 2: invokevirtual java/lang/Class.desiredAssertionStatus:()Z + 5: ifne 12 + 8: iconst_1 + 9: goto 13 + 12: iconst_0 + 13: putstatic demo/AllJavaSyntaxes.$assertionsDisabled:Z + 16: iconst_2 + 17: newarray C + 19: dup + 20: iconst_0 + 21: bipush 65 + 23: castore + 24: dup + 25: iconst_1 + 26: bipush 66 + 28: castore + 29: putstatic demo/AllJavaSyntaxes.CHARS:[C + 32: new Ljava/util/concurrent/atomic/AtomicInteger; + 35: dup + 36: invokespecial java/util/concurrent/atomic/AtomicInteger.:()V + 39: putstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 42: iconst_1 + 43: istore_0 /* x */ + 44: iconst_2 + 45: istore_1 /* y */ + 46: invokestatic demo/AllJavaSyntaxes.init:()V + 49: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + 44 5 0 x I + 46 3 1 y I + StackMapTable: 00 02 0C 40 01 + public void (); + Flags: PUBLIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/util/ArrayList.:()V + 4: aload_0 /* this */ + 5: invokedynamic BootstrapMethod #0, call:()Ljava/util/concurrent/Callable; + 10: putfield demo/AllJavaSyntaxes.callable:Ljava/util/concurrent/Callable; + 13: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + void deprecatedMethod(); + Flags: DEPRECATED + Code: + stack=0, locals=1, arguments=0 + 0: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + private static void init(); + Flags: PRIVATE, STATIC + Code: + stack=1, locals=0, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 3: invokevirtual java/util/concurrent/atomic/AtomicInteger.incrementAndGet:()I + 6: pop + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + protected final java.lang.Object[] methodReferencesAndLambdas(T... arguments); + Flags: PROTECTED, FINAL, VARARGS + Code: + stack=3, locals=2, arguments=1 + 0: aload_1 /* arguments */ + 1: invokestatic java/util/stream/Stream.of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 4: getstatic java/lang/System.out:Ljava/io/PrintStream; + 7: dup + 8: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 11: pop + 12: invokedynamic BootstrapMethod #1, accept:(Ljava/io/PrintStream;)Ljava/util/function/Consumer; + 17: invokeinterface java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V + 22: aload_1 /* arguments */ + 23: invokestatic java/util/stream/Stream.of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 26: invokedynamic BootstrapMethod #2, apply:()Ljava/util/function/Function; + 31: invokeinterface java/util/stream/Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; + 36: invokedynamic BootstrapMethod #3, apply:()Ljava/util/function/IntFunction; + 41: invokeinterface java/util/stream/Stream.toArray:(Ljava/util/function/IntFunction;)[Ljava/lang/Object; + 46: areturn + Signature: + ([TT;)[Ljava/lang/Object; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 47 0 this Ldemo/AllJavaSyntaxes; + 0 47 1 arguments [Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 47 0 this Ldemo/AllJavaSyntaxes; + void classicFor(java.lang.String[] arguments); + Code: + stack=3, locals=3, arguments=1 + 0: iconst_0 + 1: istore_2 /* index */ + 2: goto 15 + 5: aload_0 /* this */ + 6: aload_1 /* arguments */ + 7: iload_2 /* index */ + 8: aaload + 9: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 12: iinc index, 1 + 15: iload_2 /* index */ + 16: aload_1 /* arguments */ + 17: arraylength + 18: if_icmplt 5 + 21: iconst_0 + 22: istore_2 /* index */ + 23: goto 36 + 26: aload_0 /* this */ + 27: aload_1 /* arguments */ + 28: iload_2 /* index */ + 29: aaload + 30: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 33: iinc index, 1 + 36: iload_2 /* index */ + 37: aload_1 /* arguments */ + 38: arraylength + 39: if_icmplt 26 + 42: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + 0 43 1 arguments [Ljava/lang/String; + 2 19 2 index I + 23 19 2 index I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 FC 00 05 01 09 0A 09 + void whileLoop(java.lang.String[] arguments); + Code: + stack=3, locals=3, arguments=1 + 0: iconst_0 + 1: istore_2 /* index */ + 2: goto 15 + 5: aload_0 /* this */ + 6: aload_1 /* arguments */ + 7: iload_2 /* index */ + 8: iinc index, 1 + 11: aaload + 12: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 15: iload_2 /* index */ + 16: aload_1 /* arguments */ + 17: arraylength + 18: if_icmplt 5 + 21: iconst_0 + 22: istore_2 /* index */ + 23: goto 36 + 26: aload_0 /* this */ + 27: aload_1 /* arguments */ + 28: iload_2 /* index */ + 29: iinc index, 1 + 32: aaload + 33: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 36: iload_2 /* index */ + 37: aload_1 /* arguments */ + 38: arraylength + 39: if_icmplt 26 + 42: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + 0 43 1 arguments [Ljava/lang/String; + 2 41 2 index I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 FC 00 05 01 09 0A 09 + void doWhileLoop(java.lang.String[] arguments); + Code: + stack=3, locals=3, arguments=1 + 0: iconst_0 + 1: istore_2 /* index */ + 2: aload_0 /* this */ + 3: aload_1 /* arguments */ + 4: iload_2 /* index */ + 5: iinc index, 1 + 8: aaload + 9: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 12: iload_2 /* index */ + 13: aload_1 /* arguments */ + 14: arraylength + 15: if_icmplt 2 + 18: iconst_0 + 19: istore_2 /* index */ + 20: aload_0 /* this */ + 21: aload_1 /* arguments */ + 22: iload_2 /* index */ + 23: iinc index, 1 + 26: aaload + 27: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 30: iload_2 /* index */ + 31: aload_1 /* arguments */ + 32: arraylength + 33: if_icmplt 20 + 36: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 37 0 this Ldemo/AllJavaSyntaxes; + 0 37 1 arguments [Ljava/lang/String; + 2 35 2 index I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 37 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 02 FC 00 02 01 11 + void lambdaAndOptional(); + Code: + stack=2, locals=3, arguments=0 + 0: invokedynamic BootstrapMethod #4, get:()Ljava/util/function/Supplier; + 5: astore_1 /* supplier */ + 6: invokedynamic BootstrapMethod #5, apply:()Ljava/util/function/Function; + 11: astore_2 /* function */ + 12: aload_1 /* supplier */ + 13: invokeinterface java/util/function/Supplier.get:()Ljava/lang/Object; + 18: checkcast Ljava/lang/String; + 21: invokestatic java/util/Optional.ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 24: aload_2 /* function */ + 25: invokevirtual java/util/Optional.map:(Ljava/util/function/Function;)Ljava/util/Optional; + 28: aload_0 /* this */ + 29: invokedynamic BootstrapMethod #6, accept:(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer; + 34: invokevirtual java/util/Optional.ifPresent:(Ljava/util/function/Consumer;)V + 37: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- -------- ----------------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 6 32 1 supplier Ljava/util/function/Supplier; + 12 26 2 function Ljava/util/function/Function; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- -------- -------------------------------------------------------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 6 32 1 supplier Ljava/util/function/Supplier; + 12 26 2 function Ljava/util/function/Function; + void typedLambdaParams(java.util.List list); + Code: + stack=2, locals=2, arguments=1 + 0: aload_1 /* list */ + 1: invokedynamic BootstrapMethod #7, compare:()Ljava/util/Comparator; + 6: invokeinterface java/util/List.sort:(Ljava/util/Comparator;)V + 11: return + Signature: + (Ljava/util/List;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + void unTypedLambdaParams(java.util.List list); + Code: + stack=2, locals=2, arguments=1 + 0: aload_1 /* list */ + 1: invokedynamic BootstrapMethod #8, compare:()Ljava/util/Comparator; + 6: invokeinterface java/util/List.sort:(Ljava/util/Comparator;)V + 11: return + Signature: + (Ljava/util/List;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + synchronized void synchronizedMethod(); + Flags: SYNCHRONIZED + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: ldc "synchronized" + 3: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes; + void tryCatchFinally(); + Code: + stack=2, locals=3, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 3: invokevirtual java/util/concurrent/atomic/AtomicInteger.get:()I + 6: ifge 47 + 9: new Ljava/lang/IllegalStateException; + 12: dup + 13: invokespecial java/lang/IllegalStateException.:()V + 16: athrow + 17: astore_1 /* exception */ + 18: aload_0 /* this */ + 19: aload_1 /* exception */ + 20: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 23: invokevirtual java/lang/Class.getSimpleName:()Ljava/lang/String; + 26: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 29: aload_0 /* this */ + 30: ldc "finally" + 32: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 35: goto 53 + 38: astore_2 + 39: aload_0 /* this */ + 40: ldc "finally" + 42: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 45: aload_2 + 46: athrow + 47: aload_0 /* this */ + 48: ldc "finally" + 50: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 53: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------------- + 0 54 0 this Ldemo/AllJavaSyntaxes; + 18 11 1 exception Ljava/lang/RuntimeException; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 54 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 51 07 00 CC 54 07 00 D0 08 05 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---------------------------- + 0 17 17 38 Ljava/lang/RuntimeException; + 0 29 38 47 Any + void tryWithResources(java.nio.file.Path path); + Code: + stack=2, locals=6, arguments=1 + 0: aconst_null + 1: astore_3 + 2: aconst_null + 3: astore 4 + 5: aload_1 /* path */ + 6: invokestatic java/nio/file/Files.newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader; + 9: astore br + 11: goto 19 + 14: aload_0 /* this */ + 15: aload_2 /* line */ + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: aload br + 21: invokevirtual java/io/BufferedReader.readLine:()Ljava/lang/String; + 24: dup + 25: astore_2 /* line */ + 26: ifnonnull 14 + 29: aload br + 31: ifnull 90 + 34: aload br + 36: invokevirtual java/io/BufferedReader.close:()V + 39: goto 90 + 42: astore_3 + 43: aload br + 45: ifnull 53 + 48: aload br + 50: invokevirtual java/io/BufferedReader.close:()V + 53: aload_3 + 54: athrow + 55: astore 4 + 57: aload_3 + 58: ifnonnull 67 + 61: aload 4 + 63: astore_3 + 64: goto 79 + 67: aload_3 + 68: aload 4 + 70: if_acmpeq 79 + 73: aload_3 + 74: aload 4 + 76: invokevirtual java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V + 79: aload_3 + 80: athrow + 81: astore_3 /* exception */ + 82: aload_0 /* this */ + 83: aload_3 /* exception */ + 84: invokevirtual java/io/IOException.getMessage:()Ljava/lang/String; + 87: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 90: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ------------------------ + 0 91 0 this Ldemo/AllJavaSyntaxes; + 0 91 1 path Ljava/nio/file/Path; + 14 5 2 line Ljava/lang/String; + 26 16 2 line Ljava/lang/String; + 11 42 5 br Ljava/io/BufferedReader; + 82 8 3 exception Ljava/io/IOException; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 91 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 09 FF 00 0E 00 06 07 00 01 07 00 F2 07 00 94 07 00 D0 07 00 D0 07 00 DB 00 00 FF 00 04 00 06 07 00 01 07 00 F2 00 07 00 D0 07 00 D0 07 00 DB 00 00 56 07 00 D0 FA 00 0A 41 07 00 D0 0B 0B FF 00 01 00 02 07 00 01 07 00 F2 00 01 07 00 E7 08 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- --------------------- + 11 29 42 55 Any + 5 55 55 81 Any + 0 81 81 90 Ljava/io/IOException; + void assertions(int value); + Code: + stack=3, locals=2, arguments=1 + 0: getstatic demo/AllJavaSyntaxes.$assertionsDisabled:Z + 3: ifne 20 + 6: iload_1 /* value */ + 7: ifge 20 + 10: new Ljava/lang/AssertionError; + 13: dup + 14: ldc "negative" + 16: invokespecial java/lang/AssertionError.:(Ljava/lang/Object;)V + 19: athrow + 20: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 21 0 this Ldemo/AllJavaSyntaxes; + 0 21 1 value I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 21 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 14 + void boxingAndNumbers(); + Code: + stack=2, locals=4, arguments=0 + 0: iconst_1 + 1: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 4: astore_1 /* boxed */ + 5: aload_1 /* boxed */ + 6: invokevirtual java/lang/Integer.intValue:()I + 9: istore_2 /* primitive */ + 10: iload_2 /* primitive */ + 11: i2l + 12: invokestatic java/math/BigDecimal.valueOf:(J)Ljava/math/BigDecimal; + 15: astore_3 /* decimal */ + 16: aload_0 /* this */ + 17: aload_3 /* decimal */ + 18: invokevirtual java/math/BigDecimal.toPlainString:()Ljava/lang/String; + 21: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 24: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + 5 20 1 boxed Ljava/lang/Integer; + 10 15 2 primitive I + 16 9 3 decimal Ljava/math/BigDecimal; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + void instanceofPattern(java.lang.Object object); + Code: + stack=2, locals=3, arguments=1 + 0: aload_1 /* object */ + 1: instanceof Ljava/lang/String; + 4: ifeq 24 + 7: aload_1 /* object */ + 8: checkcast Ljava/lang/String; + 11: astore_2 /* text */ + 12: aload_2 /* text */ + 13: invokevirtual java/lang/String.isEmpty:()Z + 16: ifne 24 + 19: aload_0 /* this */ + 20: aload_2 /* text */ + 21: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 24: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + 0 25 1 object Ljava/lang/Object; + 12 12 2 text Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 18 + void enumSwitch(demo.AllJavaSyntaxes.Day day); + Code: + stack=2, locals=2, arguments=1 + 0: invokestatic demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:()[I + 3: aload_1 /* day */ + 4: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 7: iaload + 8: tableswitch { + 2: 32 + 3: 32 + default: 42 + } + 32: aload_0 /* this */ + 33: ldc_w "weekday" + 36: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 39: goto 49 + 42: aload_0 /* this */ + 43: ldc_w "other" + 46: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 49: return + Signature: + (Ldemo/AllJavaSyntaxes$Day;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------- + 0 50 0 this Ldemo/AllJavaSyntaxes; + 0 50 1 day Ldemo/AllJavaSyntaxes$Day; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 50 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 03 20 09 06 + public java.lang.String expressionSwitch(int value); + Flags: PUBLIC + Code: + stack=2, locals=2, arguments=1 + 0: iload_1 /* value */ + 1: tableswitch { + 0: 24 + 1: 30 + default: 36 + } + 24: ldc_w "zero" + 27: goto 44 + 30: ldc_w "one" + 33: goto 44 + 36: new Ljava/lang/IllegalArgumentException; + 39: dup + 40: invokespecial java/lang/IllegalArgumentException.:()V + 43: athrow + 44: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + 0 45 1 value I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 18 05 05 47 07 00 94 + public int compareTo(E other); + Flags: PUBLIC + Code: + stack=3, locals=2, arguments=1 + 0: invokestatic java/util/Comparator.naturalOrder:()Ljava/util/Comparator; + 3: aconst_null + 4: aload_1 /* other */ + 5: invokeinterface java/util/Comparator.compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 10: ireturn + Signature: + (TE;)I + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + 0 11 1 other Ljava/lang/Comparable; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + 0 11 1 other TE; + public int hashCode(); + Flags: PUBLIC + Code: + stack=4, locals=1, arguments=0 + 0: iconst_2 + 1: anewarray Ljava/lang/Object; + 4: dup + 5: iconst_0 + 6: aload_0 /* this */ + 7: invokespecial java/util/ArrayList.hashCode:()I + 10: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 13: aastore + 14: dup + 15: iconst_1 + 16: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 19: invokevirtual java/util/concurrent/atomic/AtomicInteger.get:()I + 22: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 25: aastore + 26: invokestatic java/util/Objects.hash:([Ljava/lang/Object;)I + 29: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + public boolean equals(java.lang.Object object); + Flags: PUBLIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* object */ + 2: if_acmpne 7 + 5: iconst_1 + 6: ireturn + 7: aload_0 /* this */ + 8: aload_1 /* object */ + 9: invokespecial java/util/ArrayList.equals:(Ljava/lang/Object;)Z + 12: ifeq 26 + 15: aload_0 /* this */ + 16: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 19: aload_1 /* object */ + 20: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 23: if_acmpeq 28 + 26: iconst_0 + 27: ireturn + 28: iconst_1 + 29: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + 0 30 1 object Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 03 07 12 01 + public abstract void log(java.lang.String p0); + Flags: PUBLIC, ABSTRACT + static > T intersectionBound(T value); + Flags: STATIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 /* value */ + 1: areturn + Signature: + ;>(TT;)TT; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------------- + 0 2 0 value Ldemo/AllJavaSyntaxes$Named; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------- + 0 2 0 value TT; + void intersectionCast(java.lang.Object object); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* object */ + 2: checkcast Ldemo/AllJavaSyntaxes$Identified; + 5: checkcast Ldemo/AllJavaSyntaxes$Named; + 8: checkcast Ldemo/AllJavaSyntaxes$Named; + 11: invokeinterface demo/AllJavaSyntaxes$Named.name:()Ljava/lang/String; + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + 0 20 1 object Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + void guardedPattern(java.lang.Object object); + Code: + stack=2, locals=4, arguments=1 + 0: aload_1 /* object */ + 1: dup + 2: invokestatic java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 5: pop + 6: astore_2 + 7: aload_2 + 8: iconst_0 + 9: invokedynamic BootstrapMethod #9, typeSwitch:(Ljava/lang/Object;I)I + 14: tableswitch { + 0: 32 + default: 61 + } + 32: aload_2 + 33: checkcast Ljava/lang/String; + 36: astore_3 /* s */ + 37: aload_3 /* s */ + 38: invokevirtual java/lang/String.length:()I + 41: iconst_3 + 42: if_icmple 48 + 45: goto 53 + 48: aload_2 + 49: iconst_1 + 50: goto 9 + 53: aload_0 /* this */ + 54: aload_3 /* s */ + 55: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 58: goto 61 + 61: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 62 0 this Ldemo/AllJavaSyntaxes; + 0 62 1 object Ljava/lang/Object; + 37 11 3 s Ljava/lang/String; + 53 8 3 s Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 62 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 05 FF 00 09 00 03 07 00 01 07 00 61 07 00 61 00 02 07 00 61 01 16 0F FC 00 04 07 00 94 F9 00 07 + double sealedSwitch(demo.AllJavaSyntaxes.Shape shape); + Code: + stack=4, locals=5, arguments=1 + 0: aload_1 /* shape */ + 1: dup + 2: invokestatic java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 5: pop + 6: astore_2 + 7: aload_2 + 8: iconst_0 + 9: invokedynamic BootstrapMethod #10, typeSwitch:(Ljava/lang/Object;I)I + 14: tableswitch { + 0: 36 + 1: 48 + default: 62 + } + 36: aload_2 + 37: checkcast Ldemo/AllJavaSyntaxes$Circle; + 40: astore_3 /* circle */ + 41: aload_3 /* circle */ + 42: invokevirtual demo/AllJavaSyntaxes$Circle.area:()D + 45: goto 72 + 48: aload_2 + 49: checkcast Ldemo/AllJavaSyntaxes$Rectangle; + 52: astore rectangle + 54: aload rectangle + 56: invokevirtual demo/AllJavaSyntaxes$Rectangle.area:()D + 59: goto 72 + 62: new Ljava/lang/MatchException; + 65: dup + 66: aconst_null + 67: aconst_null + 68: invokespecial java/lang/MatchException.:(Ljava/lang/String;Ljava/lang/Throwable;)V + 71: athrow + 72: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- -------------------------------- + 0 73 0 this Ldemo/AllJavaSyntaxes; + 0 73 1 shape Ldemo/AllJavaSyntaxes$Shape; + 41 7 3 circle Ldemo/AllJavaSyntaxes$Circle; + 54 8 4 rectangle Ldemo/AllJavaSyntaxes$Rectangle; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 73 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 FC 00 24 07 01 80 0B 0D FF 00 09 00 02 07 00 01 07 01 80 00 01 03 + java.lang.String handleResult(demo.AllJavaSyntaxes.Result result); + Code: + stack=4, locals=5, arguments=1 + 0: aload_1 /* result */ + 1: dup + 2: invokestatic java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 5: pop + 6: astore_2 + 7: aload_2 + 8: iconst_0 + 9: invokedynamic BootstrapMethod #11, typeSwitch:(Ljava/lang/Object;I)I + 14: tableswitch { + 0: 36 + 1: 56 + default: 81 + } + 36: aload_2 + 37: checkcast Ldemo/AllJavaSyntaxes$Success; + 40: astore_3 /* success */ + 41: aload_3 /* success */ + 42: invokevirtual demo/AllJavaSyntaxes$Success.value:()Ljava/lang/Object; + 45: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 48: invokedynamic BootstrapMethod #12, makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 53: goto 91 + 56: aload_2 + 57: checkcast Ldemo/AllJavaSyntaxes$Failure; + 60: astore failure + 62: aload failure + 64: invokevirtual demo/AllJavaSyntaxes$Failure.exception:()Ljava/lang/Exception; + 67: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 70: invokevirtual java/lang/Class.getSimpleName:()Ljava/lang/String; + 73: invokedynamic BootstrapMethod #13, makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 78: goto 91 + 81: new Ljava/lang/MatchException; + 84: dup + 85: aconst_null + 86: aconst_null + 87: invokespecial java/lang/MatchException.:(Ljava/lang/String;Ljava/lang/Throwable;)V + 90: athrow + 91: areturn + Signature: + (Ldemo/AllJavaSyntaxes$Result;)Ljava/lang/String; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------- ------------------------------ + 0 92 0 this Ldemo/AllJavaSyntaxes; + 0 92 1 result Ldemo/AllJavaSyntaxes$Result; + 41 15 3 success Ldemo/AllJavaSyntaxes$Success; + 62 19 4 failure Ldemo/AllJavaSyntaxes$Failure; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ------- ----------------------------------- + 0 92 0 this Ldemo/AllJavaSyntaxes; + 0 92 1 result Ldemo/AllJavaSyntaxes$Result; + 41 15 3 success Ldemo/AllJavaSyntaxes$Success; + 62 19 4 failure Ldemo/AllJavaSyntaxes$Failure; + StackMapTable: 00 04 FC 00 24 07 01 A0 13 18 FF 00 09 00 02 07 00 01 07 01 A0 00 01 07 00 94 + static T genericMethod(T value); + Flags: STATIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 /* value */ + 1: areturn + Signature: + (TT;)TT; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ------------------ + 0 2 0 value Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------- + 0 2 0 value TT; + void labeledLoops(); + Code: + stack=2, locals=3, arguments=0 + 0: iconst_0 + 1: istore_1 /* i */ + 2: goto 39 + 5: iconst_0 + 6: istore_2 /* j */ + 7: goto 31 + 10: iload_1 /* i */ + 11: iload_2 /* j */ + 12: if_icmpne 18 + 15: goto 36 + 18: iload_1 /* i */ + 19: iload_2 /* j */ + 20: iadd + 21: iconst_3 + 22: if_icmple 28 + 25: goto 36 + 28: iinc j, 1 + 31: iload_2 /* j */ + 32: iconst_3 + 33: if_icmplt 10 + 36: iinc i, 1 + 39: iload_1 /* i */ + 40: iconst_3 + 41: if_icmplt 5 + 44: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + 2 42 1 i I + 7 29 2 j I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 07 FC 00 05 01 FC 00 04 01 07 09 02 FA 00 04 02 + void labeledBlock(); + Code: + stack=2, locals=1, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 3: invokevirtual java/util/concurrent/atomic/AtomicInteger.get:()I + 6: iflt 12 + 9: goto 19 + 12: aload_0 /* this */ + 13: ldc_w "unreachable" + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 02 0C 06 + void localVar(); + Code: + stack=4, locals=4, arguments=0 + 0: bipush 123 + 2: istore_1 /* number */ + 3: ldc_w "text" + 6: astore_2 /* text */ + 7: new Ljava/util/ArrayList; + 10: dup + 11: invokespecial java/util/ArrayList.:()V + 14: astore_3 /* list */ + 15: aload_0 /* this */ + 16: aload_2 /* text */ + 17: iload_1 /* number */ + 18: aload_3 /* list */ + 19: invokevirtual java/util/ArrayList.size:()I + 22: invokedynamic BootstrapMethod #14, makeConcatWithConstants:(Ljava/lang/String;II)Ljava/lang/String; + 27: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 30: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 31 0 this Ldemo/AllJavaSyntaxes; + 3 28 1 number I + 7 24 2 text Ljava/lang/String; + 15 16 3 list Ljava/util/ArrayList; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------------- + 0 31 0 this Ldemo/AllJavaSyntaxes; + 15 16 3 list Ljava/util/ArrayList; + void multiCatch() throws java.lang.Exception; + Code: + stack=2, locals=2, arguments=0 + 0: new Ljava/io/IOException; + 3: dup + 4: invokespecial java/io/IOException.:()V + 7: athrow + 8: astore_1 /* exception */ + 9: aload_1 /* exception */ + 10: athrow + Exceptions: + throws java.lang.Exception + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + 9 2 1 exception Ljava/lang/Exception; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 48 07 01 B7 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---------------------------- + 0 8 8 11 Ljava/io/IOException; + 0 8 8 11 Ljava/lang/RuntimeException; + void suppressed() throws java.lang.Exception; + Code: + stack=3, locals=3, arguments=0 + 0: new Ljava/lang/Exception; + 3: dup + 4: ldc_w "primary" + 7: invokespecial java/lang/Exception.:(Ljava/lang/String;)V + 10: astore_1 /* primary */ + 11: new Ljava/lang/Exception; + 14: dup + 15: ldc_w "secondary" + 18: invokespecial java/lang/Exception.:(Ljava/lang/String;)V + 21: astore_2 /* secondary */ + 22: aload_1 /* primary */ + 23: aload_2 /* secondary */ + 24: invokevirtual java/lang/Exception.addSuppressed:(Ljava/lang/Throwable;)V + 27: aload_1 /* primary */ + 28: athrow + Exceptions: + throws java.lang.Exception + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 29 0 this Ldemo/AllJavaSyntaxes; + 11 18 1 primary Ljava/lang/Exception; + 22 7 2 secondary Ljava/lang/Exception; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 29 0 this Ldemo/AllJavaSyntaxes; + java.lang.String throwExpression(java.lang.Integer value); + Code: + stack=2, locals=2, arguments=1 + 0: aload_1 /* value */ + 1: invokestatic java/util/Optional.ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 4: invokedynamic BootstrapMethod #15, apply:()Ljava/util/function/Function; + 9: invokevirtual java/util/Optional.map:(Ljava/util/function/Function;)Ljava/util/Optional; + 12: invokedynamic BootstrapMethod #16, get:()Ljava/util/function/Supplier; + 17: invokevirtual java/util/Optional.orElseThrow:(Ljava/util/function/Supplier;)Ljava/lang/Object; + 20: checkcast Ljava/lang/String; + 23: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 24 0 this Ldemo/AllJavaSyntaxes; + 0 24 1 value Ljava/lang/Integer; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 24 0 this Ldemo/AllJavaSyntaxes; + void synchronizedBlock(); + Code: + stack=2, locals=2, arguments=0 + 0: aload_0 /* this */ + 1: dup + 2: astore_1 + 3: monitorenter + 4: aload_0 /* this */ + 5: ldc_w "sync" + 8: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 11: aload_1 + 12: monitorexit + 13: goto 19 + 16: aload_1 + 17: monitorexit + 18: athrow + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 02 FF 00 10 00 02 07 00 01 07 00 01 00 01 07 00 D0 FA 00 02 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---- + 4 13 16 19 Any + 16 18 16 19 Any + void localClass(); + Code: + stack=4, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: new Ldemo/AllJavaSyntaxes$1Local; + 4: dup + 5: aload_0 /* this */ + 6: invokespecial demo/AllJavaSyntaxes$1Local.:(Ldemo/AllJavaSyntaxes;)V + 9: invokevirtual demo/AllJavaSyntaxes$1Local.value:()Ljava/lang/String; + 12: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 15: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 16 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 16 0 this Ldemo/AllJavaSyntaxes; + void intersectionThrows() throws T, java.lang.Exception; + Code: + stack=0, locals=1, arguments=0 + 0: return + Exceptions: + throws java.lang.Exception + Signature: + ()V [from metadata: ()V^TT;] + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + void wildcard(java.util.List list); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* list */ + 2: invokevirtual demo/AllJavaSyntaxes.capture:(Ljava/util/List;)V + 5: return + Signature: + (Ljava/util/List<*>;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + 0 6 1 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + 0 6 1 list Ljava/util/List<*>; + private void capture(java.util.List list); + Flags: PRIVATE + Code: + stack=2, locals=4, arguments=1 + 0: aload_1 /* list */ + 1: invokeinterface java/util/List.iterator:()Ljava/util/Iterator; + 6: astore_3 + 7: goto 28 + 10: aload_3 + 11: invokeinterface java/util/Iterator.next:()Ljava/lang/Object; + 16: checkcast Ljava/lang/Object; + 19: astore_2 /* element */ + 20: aload_0 /* this */ + 21: aload_2 /* element */ + 22: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 25: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 28: aload_3 + 29: invokeinterface java/util/Iterator.hasNext:()Z + 34: ifne 10 + 37: return + Signature: + (Ljava/util/List;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------- ---------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 0 38 1 list Ljava/util/List; + 20 8 2 element Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ------- --------------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 0 38 1 list Ljava/util/List; + 20 8 2 element TT; + StackMapTable: 00 02 FF 00 0A 00 04 07 00 01 07 00 B3 00 07 01 E4 00 00 11 + void typeUse(); + Code: + stack=3, locals=3, arguments=0 + 0: ldc_w "x" + 3: astore_1 /* value */ + 4: aload_1 /* value */ + 5: invokestatic java/util/List.of:(Ljava/lang/Object;)Ljava/util/List; + 8: astore_2 /* list */ + 9: aload_0 /* this */ + 10: aload_2 /* list */ + 11: iconst_0 + 12: invokeinterface java/util/List.get:(I)Ljava/lang/Object; + 17: checkcast Ljava/lang/String; + 20: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 23: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 24 0 this Ldemo/AllJavaSyntaxes; + 4 20 1 value Ljava/lang/String; + 9 15 2 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 24 0 this Ldemo/AllJavaSyntaxes; + 9 15 2 list Ljava/util/List; + RuntimeInvisibleTypeAnnotations: 00 02 40 00 01 00 04 00 14 00 01 00 01 F6 00 00 40 00 01 00 09 00 0F 00 02 01 03 00 01 F6 00 00 + void arrays(); + Code: + stack=7, locals=1, arguments=0 + 0: iconst_0 + 1: newarray I + 3: pop + 4: iconst_3 + 5: newarray I + 7: dup + 8: iconst_0 + 9: iconst_1 + 10: iastore + 11: dup + 12: iconst_1 + 13: iconst_2 + 14: iastore + 15: dup + 16: iconst_2 + 17: iconst_3 + 18: iastore + 19: pop + 20: iconst_2 + 21: anewarray [Ljava/lang/String; + 24: dup + 25: iconst_0 + 26: iconst_1 + 27: anewarray Ljava/lang/String; + 30: dup + 31: iconst_0 + 32: ldc_w "a" + 35: aastore + 36: aastore + 37: dup + 38: iconst_1 + 39: iconst_1 + 40: anewarray Ljava/lang/String; + 43: dup + 44: iconst_0 + 45: ldc_w "b" + 48: aastore + 49: aastore + 50: pop + 51: iconst_1 + 52: newarray I + 54: pop + 55: iconst_2 + 56: newarray I + 58: dup + 59: iconst_1 + 60: iconst_1 + 61: iastore + 62: pop + 63: iconst_2 + 64: anewarray [I + 67: dup + 68: iconst_0 + 69: iconst_3 + 70: newarray I + 72: dup + 73: iconst_0 + 74: iconst_1 + 75: iastore + 76: dup + 77: iconst_1 + 78: iconst_2 + 79: iastore + 80: dup + 81: iconst_2 + 82: iconst_3 + 83: iastore + 84: aastore + 85: dup + 86: iconst_1 + 87: iconst_3 + 88: newarray I + 90: dup + 91: iconst_0 + 92: iconst_4 + 93: iastore + 94: dup + 95: iconst_1 + 96: iconst_5 + 97: iastore + 98: dup + 99: iconst_2 + 100: bipush 6 + 102: iastore + 103: aastore + 104: pop + 105: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 106 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 106 0 this Ldemo/AllJavaSyntaxes; + void literals(); + Code: + stack=9, locals=9, arguments=0 + 0: bipush 10 + 2: istore_1 /* bin */ + 3: sipush 255 + 6: istore_2 /* hex */ + 7: ldc2_w 1000000 + 10: lstore_3 /* underscore */ + 11: fconst_1 + 12: fstore f + 14: ldc2_w 1000.0 + 17: dstore d + 19: bipush 65 + 21: istore ch + 23: aload_0 /* this */ + 24: iload_1 /* bin */ + 25: iload_2 /* hex */ + 26: lload_3 /* underscore */ + 27: fload f + 29: dload d + 31: iload ch + 33: invokedynamic BootstrapMethod #17, makeConcatWithConstants:(IIJFDC)Ljava/lang/String; + 38: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 41: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---------- ---------------------- + 0 42 0 this Ldemo/AllJavaSyntaxes; + 3 39 1 bin I + 7 35 2 hex I + 11 31 3 underscore J + 14 28 5 f F + 19 23 6 d D + 23 19 8 ch C + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 42 0 this Ldemo/AllJavaSyntaxes; + void textBlock(); + Code: + stack=2, locals=2, arguments=0 + 0: ldc_w "line1\nline2\n" + 3: astore_1 /* text */ + 4: aload_0 /* this */ + 5: aload_1 /* text */ + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + 4 6 1 text Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + int switchYield(int i); + Code: + stack=1, locals=2, arguments=1 + 0: iload_1 /* i */ + 1: tableswitch { + 0: 20 + default: 25 + } + 20: bipush 10 + 22: goto 26 + 25: iconst_m1 + 26: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 27 0 this Ldemo/AllJavaSyntaxes; + 0 27 1 i I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 27 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 03 14 04 40 01 + void allOperators(); + Code: + stack=3, locals=12, arguments=0 + 0: bipush 10 + 2: istore_1 /* a */ + 3: iconst_3 + 4: istore_2 /* b */ + 5: iload_1 /* a */ + 6: iload_2 /* b */ + 7: idiv + 8: pop + 9: iload_1 /* a */ + 10: iload_2 /* b */ + 11: irem + 12: pop + 13: iinc a, 1 + 16: iinc a, -1 + 19: iinc a, 1 + 22: iinc a, -1 + 25: iload_1 /* a */ + 26: iload_2 /* b */ + 27: if_icmple 30 + 30: ldc_w "x" + 33: instanceof Ljava/lang/String; + 36: pop + 37: iload_1 /* a */ + 38: i2l + 39: lstore_3 /* widened */ + 40: new Ljava/lang/Object; + 43: invokespecial java/lang/Object.:()V + 46: iconst_3 + 47: newarray I + 49: astore array + 51: aload array + 53: iconst_0 + 54: iaload + 55: istore element + 57: aload_0 /* this */ + 58: iload element + 60: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 63: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 66: aload array + 68: arraylength + 69: pop + 70: invokedynamic BootstrapMethod #5, apply:()Ljava/util/function/Function; + 75: pop + 76: invokedynamic BootstrapMethod #18, get:()Ljava/util/function/Supplier; + 81: pop + 82: aload_0 /* this */ + 83: ldc_w "this" + 86: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 89: aload_0 /* this */ + 90: invokespecial java/util/ArrayList.size:()I + 93: pop + 94: invokedynamic BootstrapMethod #19, compare:()Ljava/util/Comparator; + 99: pop + 100: iconst_1 + 101: iconst_1 + 102: multianewarray [[I + 106: astore matrix + 108: aload matrix + 110: iconst_0 + 111: aaload + 112: arraylength + 113: pop + 114: aload_0 /* this */ + 115: invokedynamic BootstrapMethod #20, run:(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable; + 120: pop + 121: invokedynamic BootstrapMethod #21, get:()Ljava/util/function/Supplier; + 126: pop + 127: iload_1 /* a */ + 128: tableswitch { + 0: 148 + default: 152 + } + 148: iconst_0 + 149: goto 153 + 152: iconst_1 + 153: istore yielded + 155: getstatic demo/AllJavaSyntaxes.$assertionsDisabled:Z + 158: ifne 174 + 161: iload yielded + 163: ifge 174 + 166: new Ljava/lang/AssertionError; + 169: dup + 170: invokespecial java/lang/AssertionError.:()V + 173: athrow + 174: new Ljava/lang/RuntimeException; + 177: dup + 178: invokespecial java/lang/RuntimeException.:()V + 181: astore exception + 183: aload exception + 185: ifnonnull 188 + 188: iconst_0 + 189: istore i + 191: bipush 10 + 193: istore j + 195: goto 217 + 198: aload_0 /* this */ + 199: iload i + 201: iload j + 203: invokedynamic BootstrapMethod #22, makeConcatWithConstants:(II)Ljava/lang/String; + 208: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 211: iinc i, 1 + 214: iinc j, -1 + 217: iload i + 219: iload j + 221: if_icmplt 198 + 224: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------------- + 0 225 0 this Ldemo/AllJavaSyntaxes; + 3 222 1 a I + 5 220 2 b I + 40 185 3 widened J + 51 174 5 array [I + 57 168 6 element I + 108 117 7 matrix [[I + 155 70 8 yielded I + 183 42 9 exception Ljava/lang/RuntimeException; + 191 33 10 i I + 195 29 11 j I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 225 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 08 FD 00 1E 01 01 FF 00 75 00 07 07 00 01 01 01 04 07 01 FD 01 07 02 1B 00 00 03 40 01 FC 00 14 01 FC 00 0D 07 00 CC FD 00 09 01 01 12 + void qualifiedNew(demo.AllJavaSyntaxes.Outer outer); + Code: + stack=5, locals=2, arguments=1 + 0: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 3: aload_1 /* outer */ + 4: dup + 5: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 8: pop + 9: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 12: new Ldemo/AllJavaSyntaxes$Outer$Inner$Deep; + 15: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 18: dup + 19: aload_1 /* outer */ + 20: dup + 21: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 24: pop + 25: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 28: dup + 29: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 32: pop + 33: invokespecial demo/AllJavaSyntaxes$Outer$Inner$Deep.:(Ldemo/AllJavaSyntaxes$Outer$Inner;)V + 36: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 39: aload_1 /* outer */ + 40: dup + 41: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 44: pop + 45: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 48: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 51: new Ldemo/AllJavaSyntaxes$Outer; + 54: dup + 55: aload_0 /* this */ + 56: dup + 57: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 60: pop + 61: invokespecial demo/AllJavaSyntaxes$Outer.:(Ldemo/AllJavaSyntaxes;)V + 64: dup + 65: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 68: pop + 69: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 72: new Ldemo/AllJavaSyntaxes$1; + 75: aload_0 /* this */ + 76: aload_1 /* outer */ + 77: dup + 78: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 81: pop + 82: invokespecial demo/AllJavaSyntaxes$1.:(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V + 85: new Ldemo/AllJavaSyntaxes$Outer$StaticNested; + 88: invokespecial demo/AllJavaSyntaxes$Outer$StaticNested.:()V + 91: new Ldemo/AllJavaSyntaxes$Outer$StaticNested; + 94: invokespecial demo/AllJavaSyntaxes$Outer$StaticNested.:()V + 97: return + Signature: + (Ldemo/AllJavaSyntaxes$Outer;)V [from metadata: (Ldemo/AllJavaSyntaxes.Outer;)V] + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------------- + 0 98 0 this Ldemo/AllJavaSyntaxes; + 0 98 1 outer Ldemo/AllJavaSyntaxes$Outer; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------------- + 0 98 0 this Ldemo/AllJavaSyntaxes; + 0 98 1 outer Ldemo/AllJavaSyntaxes$Outer; + void receiverParameter(); + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: ldc_w "receiver" + 4: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; + void diamondAnonymous(); + Code: + stack=4, locals=2, arguments=0 + 0: new Ldemo/AllJavaSyntaxes$2; + 3: dup + 4: aload_0 /* this */ + 5: invokespecial demo/AllJavaSyntaxes$2.:(Ldemo/AllJavaSyntaxes;)V + 8: astore_1 /* c */ + 9: aload_0 /* this */ + 10: aload_1 /* c */ + 11: ldc_w "a" + 14: ldc_w "b" + 17: invokeinterface java/util/Comparator.compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 22: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 25: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 28: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 29 0 this Ldemo/AllJavaSyntaxes; + 9 20 1 c Ljava/util/Comparator; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------------ + 0 29 0 this Ldemo/AllJavaSyntaxes; + 9 20 1 c Ljava/util/Comparator; + void emptyStatement(boolean flag); + Code: + stack=1, locals=2, arguments=1 + 0: iload_1 /* flag */ + 1: ifne 0 + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes; + 0 5 1 flag Z + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 00 + void multiDimVarargs(int[]... values); + Flags: VARARGS + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* values */ + 2: arraylength + 3: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + 0 10 1 values [[I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + double strict(double a, double b); + Code: + stack=4, locals=5, arguments=2 + 0: dload_1 /* a */ + 1: dload_3 + 2: ddiv + 3: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes; + 0 4 1 a D + 0 4 3 b D + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes; + void chainedAssignment(); + Code: + stack=3, locals=4, arguments=0 + 0: bipush 10 + 2: dup + 3: istore_3 /* c */ + 4: dup + 5: istore_2 /* b */ + 6: istore_1 /* a */ + 7: aload_0 /* this */ + 8: iload_1 /* a */ + 9: iload_2 /* b */ + 10: iadd + 11: iload_3 /* c */ + 12: iadd + 13: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + 7 13 1 a I + 6 14 2 b I + 4 16 3 c I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + void parameterAnnotation(java.lang.String value); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* value */ + 2: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 5: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + 0 6 1 value Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + public int compareTo(java.lang.Object p0); + Flags: PUBLIC, BRIDGE, SYNTHETIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 + 1: aload_1 + 2: checkcast Ljava/lang/Comparable; + 5: invokevirtual demo/AllJavaSyntaxes.compareTo:(Ljava/lang/Comparable;)I + 8: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + static int[] $SWITCH_TABLE$demo$AllJavaSyntaxes$Day(); + Flags: STATIC, SYNTHETIC + Code: + stack=3, locals=1, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 3: dup + 4: ifnull 8 + 7: areturn + 8: pop + 9: invokestatic demo/AllJavaSyntaxes$Day.values:()[Ldemo/AllJavaSyntaxes$Day; + 12: arraylength + 13: newarray I + 15: astore_0 + 16: aload_0 + 17: getstatic demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 20: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 23: iconst_5 + 24: iastore + 25: goto 29 + 28: pop + 29: aload_0 + 30: getstatic demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 33: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 36: iconst_1 + 37: iastore + 38: goto 42 + 41: pop + 42: aload_0 + 43: getstatic demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 46: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 49: bipush 6 + 51: iastore + 52: goto 56 + 55: pop + 56: aload_0 + 57: getstatic demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 60: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 63: bipush 7 + 65: iastore + 66: goto 70 + 69: pop + 70: aload_0 + 71: getstatic demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 74: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 77: iconst_4 + 78: iastore + 79: goto 83 + 82: pop + 83: aload_0 + 84: getstatic demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 87: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 90: iconst_2 + 91: iastore + 92: goto 96 + 95: pop + 96: aload_0 + 97: getstatic demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 100: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 103: iconst_3 + 104: iastore + 105: goto 109 + 108: pop + 109: aload_0 + 110: dup + 111: putstatic demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 114: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + StackMapTable: 00 0F 48 07 01 FD FF 00 13 00 01 07 01 FD 00 01 07 02 77 00 4B 07 02 77 00 4C 07 02 77 00 4C 07 02 77 00 4B 07 02 77 00 4B 07 02 77 00 4B 07 02 77 00 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---------------------------- + 16 25 28 29 Ljava/lang/NoSuchFieldError; + 29 38 41 42 Ljava/lang/NoSuchFieldError; + 42 52 55 56 Ljava/lang/NoSuchFieldError; + 56 66 69 70 Ljava/lang/NoSuchFieldError; + 70 79 82 83 Ljava/lang/NoSuchFieldError; + 83 92 95 96 Ljava/lang/NoSuchFieldError; + 96 105 108 109 Ljava/lang/NoSuchFieldError; + private static java.lang.String lambda$0() throws java.lang.Exception; + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=0, arguments=0 + 0: ldc_w "callable" + 3: areturn + Exceptions: + throws java.lang.Exception + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private static java.lang.Object[] lambda$3(int p0); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: iload_0 + 1: anewarray Ljava/lang/Object; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private static java.lang.String lambda$4(); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=0, arguments=0 + 0: ldc_w "value" + 3: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void lambda$6(java.lang.Integer length); + Flags: PRIVATE, SYNTHETIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* length */ + 2: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 5: invokedynamic BootstrapMethod #23, makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 10: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 13: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + 0 14 1 length Ljava/lang/Integer; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + private static int lambda$7(java.lang.String a, java.lang.String b); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=2, locals=2, arguments=2 + 0: aload_1 /* b */ + 1: aload_0 /* a */ + 2: invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + 5: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------ + 0 6 0 a Ljava/lang/String; + 0 6 1 b Ljava/lang/String; + private static int lambda$8(java.lang.String a, java.lang.String b); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=2, locals=2, arguments=2 + 0: aload_1 /* b */ + 1: aload_0 /* a */ + 2: invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + 5: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------ + 0 6 0 a Ljava/lang/String; + 0 6 1 b Ljava/lang/String; + private static java.lang.IllegalArgumentException lambda$10(); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=2, locals=0, arguments=0 + 0: new Ljava/lang/IllegalArgumentException; + 3: dup + 4: invokespecial java/lang/IllegalArgumentException.:()V + 7: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private static java.lang.Integer lambda$12(); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=0, arguments=0 + 0: bipush 42 + 2: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 5: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void lambda$14(); + Flags: PRIVATE, SYNTHETIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: ldc_w "run" + 4: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; +interface demo.AllJavaSyntaxes.AdvancedInterface + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface AdvancedInterface = demo/AllJavaSyntaxes$AdvancedInterface of demo/AllJavaSyntaxes + NestHost: 00 17 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$AdvancedInterface + 2: Utf8StringConstant "demo/AllJavaSyntaxes$AdvancedInterface" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "defaultMethod" + 6: Utf8StringConstant "()Ljava/lang/String;" + 7: Utf8StringConstant "Code" + 8: InterfaceMethodReference #1.#9 // demo/AllJavaSyntaxes$AdvancedInterface.privateHelper:()Ljava/lang/String; + 9: NameAndTypeDescriptor #10.#6 // privateHelper:()Ljava/lang/String; + 10: Utf8StringConstant "privateHelper" + 11: Utf8StringConstant "LineNumberTable" + 12: Utf8StringConstant "LocalVariableTable" + 13: Utf8StringConstant "this" + 14: Utf8StringConstant "Ldemo/AllJavaSyntaxes$AdvancedInterface;" + 15: Utf8StringConstant "staticMethod" + 16: StringConstant #17 // "static" + 17: Utf8StringConstant "static" + 18: StringConstant #19 // "private" + 19: Utf8StringConstant "private" + 20: Utf8StringConstant "SourceFile" + 21: Utf8StringConstant "AllJavaSyntaxes.java" + 22: Utf8StringConstant "InnerClasses" + 23: TypeInfo #24 // demo/AllJavaSyntaxes + 24: Utf8StringConstant "demo/AllJavaSyntaxes" + 25: Utf8StringConstant "AdvancedInterface" + 26: Utf8StringConstant "NestHost" + public java.lang.String defaultMethod(); + Flags: PUBLIC, DEFAULT + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokeinterface demo/AllJavaSyntaxes$AdvancedInterface.privateHelper:()Ljava/lang/String; + 6: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$AdvancedInterface; + public static java.lang.String staticMethod(); + Flags: PUBLIC, DEFAULT, STATIC + Code: + stack=1, locals=0, arguments=0 + 0: ldc "static" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private java.lang.String privateHelper(); + Flags: PRIVATE, DEFAULT + Code: + stack=1, locals=1, arguments=0 + 0: ldc "private" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$AdvancedInterface; +class demo.AllJavaSyntaxes.Base + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static Base = demo/AllJavaSyntaxes$Base of demo/AllJavaSyntaxes + NestHost: 00 15 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Base + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Base" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Base;" + 14: Utf8StringConstant "value" + 15: Utf8StringConstant "()Ljava/lang/String;" + 16: StringConstant #17 // "base" + 17: Utf8StringConstant "base" + 18: Utf8StringConstant "SourceFile" + 19: Utf8StringConstant "AllJavaSyntaxes.java" + 20: Utf8StringConstant "InnerClasses" + 21: TypeInfo #22 // demo/AllJavaSyntaxes + 22: Utf8StringConstant "demo/AllJavaSyntaxes" + 23: Utf8StringConstant "Base" + 24: Utf8StringConstant "NestHost" + void (); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Base; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: ldc "base" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$Base; +class demo.AllJavaSyntaxes.Circle + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static final Circle = demo/AllJavaSyntaxes$Circle of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Circle + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Circle" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // demo/AllJavaSyntaxes$Shape + 6: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 7: Utf8StringConstant "radius" + 8: Utf8StringConstant "D" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(D)V" + 11: Utf8StringConstant "Code" + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #9.#14 // :()V + 14: Utf8StringConstant "()V" + 15: FieldReference #1.#16 // demo/AllJavaSyntaxes$Circle.radius:D + 16: NameAndTypeDescriptor #7.#8 // radius:D + 17: Utf8StringConstant "LineNumberTable" + 18: Utf8StringConstant "LocalVariableTable" + 19: Utf8StringConstant "this" + 20: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Circle;" + 21: Utf8StringConstant "area" + 22: Utf8StringConstant "()D" + 23: TypeInfo #24 // java/lang/Math + 24: Utf8StringConstant "java/lang/Math" + 25: DoubleConstant 3.141592653589793 + 27: Utf8StringConstant "SourceFile" + 28: Utf8StringConstant "AllJavaSyntaxes.java" + 29: Utf8StringConstant "InnerClasses" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "Circle" + 33: Utf8StringConstant "Shape" + 34: Utf8StringConstant "NestHost" + private final double radius; + Flags: PRIVATE, FINAL + void (double radius); + Code: + stack=3, locals=3, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: aload_0 /* this */ + 5: dload_1 /* radius */ + 6: putfield demo/AllJavaSyntaxes$Circle.radius:D + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ----------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Circle; + 0 10 1 radius D + public double area(); + Flags: PUBLIC + Code: + stack=4, locals=1, arguments=0 + 0: ldc2_w 3.141592653589793 + 3: aload_0 /* this */ + 4: getfield demo/AllJavaSyntaxes$Circle.radius:D + 7: dmul + 8: aload_0 /* this */ + 9: getfield demo/AllJavaSyntaxes$Circle.radius:D + 12: dmul + 13: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes$Circle; +interface demo.AllJavaSyntaxes.Shape + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, SEALED, INTERFACE + SourceFile: AllJavaSyntaxes.java + PermittedSubclasses: demo/AllJavaSyntaxes$Circle, demo/AllJavaSyntaxes$Rectangle + InnerClasses: + static final Circle = demo/AllJavaSyntaxes$Circle of demo/AllJavaSyntaxes + static final Rectangle = demo/AllJavaSyntaxes$Rectangle of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + NestHost: 00 0F + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Shape + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "area" + 6: Utf8StringConstant "()D" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "PermittedSubclasses" + 10: TypeInfo #11 // demo/AllJavaSyntaxes$Circle + 11: Utf8StringConstant "demo/AllJavaSyntaxes$Circle" + 12: TypeInfo #13 // demo/AllJavaSyntaxes$Rectangle + 13: Utf8StringConstant "demo/AllJavaSyntaxes$Rectangle" + 14: Utf8StringConstant "InnerClasses" + 15: TypeInfo #16 // demo/AllJavaSyntaxes + 16: Utf8StringConstant "demo/AllJavaSyntaxes" + 17: Utf8StringConstant "Circle" + 18: Utf8StringConstant "Rectangle" + 19: Utf8StringConstant "Shape" + 20: Utf8StringConstant "NestHost" + public abstract double area(); + Flags: PUBLIC, ABSTRACT +class demo.AllJavaSyntaxes.Rectangle + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static final Rectangle = demo/AllJavaSyntaxes$Rectangle of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + NestHost: 00 1D + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Rectangle + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Rectangle" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // demo/AllJavaSyntaxes$Shape + 6: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 7: Utf8StringConstant "width" + 8: Utf8StringConstant "D" + 9: Utf8StringConstant "height" + 10: Utf8StringConstant "" + 11: Utf8StringConstant "(DD)V" + 12: Utf8StringConstant "Code" + 13: MethodReference #3.#14 // java/lang/Object.:()V + 14: NameAndTypeDescriptor #10.#15 // :()V + 15: Utf8StringConstant "()V" + 16: FieldReference #1.#17 // demo/AllJavaSyntaxes$Rectangle.width:D + 17: NameAndTypeDescriptor #7.#8 // width:D + 18: FieldReference #1.#19 // demo/AllJavaSyntaxes$Rectangle.height:D + 19: NameAndTypeDescriptor #9.#8 // height:D + 20: Utf8StringConstant "LineNumberTable" + 21: Utf8StringConstant "LocalVariableTable" + 22: Utf8StringConstant "this" + 23: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Rectangle;" + 24: Utf8StringConstant "area" + 25: Utf8StringConstant "()D" + 26: Utf8StringConstant "SourceFile" + 27: Utf8StringConstant "AllJavaSyntaxes.java" + 28: Utf8StringConstant "InnerClasses" + 29: TypeInfo #30 // demo/AllJavaSyntaxes + 30: Utf8StringConstant "demo/AllJavaSyntaxes" + 31: Utf8StringConstant "Rectangle" + 32: Utf8StringConstant "Shape" + 33: Utf8StringConstant "NestHost" + private final double width; + Flags: PRIVATE, FINAL + private final double height; + Flags: PRIVATE, FINAL + void (double width, double height); + Code: + stack=3, locals=5, arguments=2 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: aload_0 /* this */ + 5: dload_1 /* width */ + 6: putfield demo/AllJavaSyntaxes$Rectangle.width:D + 9: aload_0 /* this */ + 10: dload_3 + 11: putfield demo/AllJavaSyntaxes$Rectangle.height:D + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ -------------------------------- + 0 15 0 this Ldemo/AllJavaSyntaxes$Rectangle; + 0 15 1 width D + 0 15 3 height D + public double area(); + Flags: PUBLIC + Code: + stack=4, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Rectangle.width:D + 4: aload_0 /* this */ + 5: getfield demo/AllJavaSyntaxes$Rectangle.height:D + 8: dmul + 9: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Rectangle; +enum demo.AllJavaSyntaxes.Day + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Enum; + InnerClasses: + static final enum Day = demo/AllJavaSyntaxes$Day of demo/AllJavaSyntaxes + NestHost: 00 43 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Day + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Day" + 3: TypeInfo #4 // java/lang/Enum + 4: Utf8StringConstant "java/lang/Enum" + 5: Utf8StringConstant "MONDAY" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Day;" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "TUESDAY" + 9: Utf8StringConstant "WEDNESDAY" + 10: Utf8StringConstant "THURSDAY" + 11: Utf8StringConstant "FRIDAY" + 12: Utf8StringConstant "SATURDAY" + 13: Utf8StringConstant "SUNDAY" + 14: Utf8StringConstant "ENUM$VALUES" + 15: Utf8StringConstant "[Ldemo/AllJavaSyntaxes$Day;" + 16: Utf8StringConstant "" + 17: Utf8StringConstant "()V" + 18: Utf8StringConstant "Code" + 19: StringConstant #5 // "MONDAY" + 20: MethodReference #1.#21 // demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 21: NameAndTypeDescriptor #22.#23 // :(Ljava/lang/String;I)V + 22: Utf8StringConstant "" + 23: Utf8StringConstant "(Ljava/lang/String;I)V" + 24: FieldReference #1.#25 // demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 25: NameAndTypeDescriptor #5.#6 // MONDAY:Ldemo/AllJavaSyntaxes$Day; + 26: StringConstant #8 // "TUESDAY" + 27: FieldReference #1.#28 // demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 28: NameAndTypeDescriptor #8.#6 // TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 29: StringConstant #9 // "WEDNESDAY" + 30: FieldReference #1.#31 // demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 31: NameAndTypeDescriptor #9.#6 // WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 32: StringConstant #10 // "THURSDAY" + 33: FieldReference #1.#34 // demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 34: NameAndTypeDescriptor #10.#6 // THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 35: StringConstant #11 // "FRIDAY" + 36: FieldReference #1.#37 // demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 37: NameAndTypeDescriptor #11.#6 // FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 38: StringConstant #12 // "SATURDAY" + 39: FieldReference #1.#40 // demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 40: NameAndTypeDescriptor #12.#6 // SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 41: StringConstant #13 // "SUNDAY" + 42: FieldReference #1.#43 // demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 43: NameAndTypeDescriptor #13.#6 // SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 44: FieldReference #1.#45 // demo/AllJavaSyntaxes$Day.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 45: NameAndTypeDescriptor #14.#15 // ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 46: Utf8StringConstant "LineNumberTable" + 47: Utf8StringConstant "LocalVariableTable" + 48: MethodReference #3.#21 // java/lang/Enum.:(Ljava/lang/String;I)V + 49: Utf8StringConstant "this" + 50: Utf8StringConstant "values" + 51: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Day;" + 52: MethodReference #53.#55 // java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 53: TypeInfo #54 // java/lang/System + 54: Utf8StringConstant "java/lang/System" + 55: NameAndTypeDescriptor #56.#57 // arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 56: Utf8StringConstant "arraycopy" + 57: Utf8StringConstant "(Ljava/lang/Object;ILjava/lang/Object;II)V" + 58: Utf8StringConstant "valueOf" + 59: Utf8StringConstant "(Ljava/lang/String;)Ldemo/AllJavaSyntaxes$Day;" + 60: MethodReference #3.#61 // java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 61: NameAndTypeDescriptor #58.#62 // valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 62: Utf8StringConstant "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;" + 63: Utf8StringConstant "SourceFile" + 64: Utf8StringConstant "AllJavaSyntaxes.java" + 65: Utf8StringConstant "Ljava/lang/Enum;" + 66: Utf8StringConstant "InnerClasses" + 67: TypeInfo #68 // demo/AllJavaSyntaxes + 68: Utf8StringConstant "demo/AllJavaSyntaxes" + 69: Utf8StringConstant "Day" + 70: Utf8StringConstant "NestHost" + public static final demo.AllJavaSyntaxes.Day MONDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day TUESDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day WEDNESDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day THURSDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day FRIDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day SATURDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day SUNDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + private static final demo.AllJavaSyntaxes.Day[] ENUM$VALUES; + Flags: PRIVATE, STATIC, FINAL, SYNTHETIC + static {}; + Flags: STATIC + Code: + stack=4, locals=0, arguments=0 + 0: new Ldemo/AllJavaSyntaxes$Day; + 3: dup + 4: ldc "MONDAY" + 6: iconst_0 + 7: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 10: putstatic demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 13: new Ldemo/AllJavaSyntaxes$Day; + 16: dup + 17: ldc "TUESDAY" + 19: iconst_1 + 20: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 23: putstatic demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 26: new Ldemo/AllJavaSyntaxes$Day; + 29: dup + 30: ldc "WEDNESDAY" + 32: iconst_2 + 33: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 36: putstatic demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 39: new Ldemo/AllJavaSyntaxes$Day; + 42: dup + 43: ldc "THURSDAY" + 45: iconst_3 + 46: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 49: putstatic demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 52: new Ldemo/AllJavaSyntaxes$Day; + 55: dup + 56: ldc "FRIDAY" + 58: iconst_4 + 59: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 62: putstatic demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 65: new Ldemo/AllJavaSyntaxes$Day; + 68: dup + 69: ldc "SATURDAY" + 71: iconst_5 + 72: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 75: putstatic demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 78: new Ldemo/AllJavaSyntaxes$Day; + 81: dup + 82: ldc "SUNDAY" + 84: bipush 6 + 86: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 89: putstatic demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 92: bipush 7 + 94: anewarray Ldemo/AllJavaSyntaxes$Day; + 97: dup + 98: iconst_0 + 99: getstatic demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 102: aastore + 103: dup + 104: iconst_1 + 105: getstatic demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 108: aastore + 109: dup + 110: iconst_2 + 111: getstatic demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 114: aastore + 115: dup + 116: iconst_3 + 117: getstatic demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 120: aastore + 121: dup + 122: iconst_4 + 123: getstatic demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 126: aastore + 127: dup + 128: iconst_5 + 129: getstatic demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 132: aastore + 133: dup + 134: bipush 6 + 136: getstatic demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 139: aastore + 140: putstatic demo/AllJavaSyntaxes$Day.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 143: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void (java.lang.String p0, int p1); + Flags: PRIVATE + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial java/lang/Enum.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Day; + public static demo.AllJavaSyntaxes.Day[] values(); + Flags: PUBLIC, STATIC + Code: + stack=5, locals=3, arguments=0 + 0: getstatic demo/AllJavaSyntaxes$Day.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 3: dup + 4: astore_0 + 5: iconst_0 + 6: aload_0 + 7: arraylength + 8: dup + 9: istore_1 + 10: anewarray Ldemo/AllJavaSyntaxes$Day; + 13: dup + 14: astore_2 + 15: iconst_0 + 16: iload_1 + 17: invokestatic java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 20: aload_2 + 21: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public static demo.AllJavaSyntaxes.Day valueOf(java.lang.String p0); + Flags: PUBLIC, STATIC + Code: + stack=2, locals=1, arguments=1 + 0: ldc Ldemo/AllJavaSyntaxes$Day;.class + 2: aload_0 + 3: invokestatic java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 6: checkcast Ldemo/AllJavaSyntaxes$Day; + 9: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.Derived + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static Base = demo/AllJavaSyntaxes$Base of demo/AllJavaSyntaxes + Derived = demo/AllJavaSyntaxes$Derived of demo/AllJavaSyntaxes + NestHost: 00 22 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Derived + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Derived" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Base + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Base" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: StringConstant #11 // "x" + 11: Utf8StringConstant "x" + 12: MethodReference #1.#13 // demo/AllJavaSyntaxes$Derived.:(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V + 13: NameAndTypeDescriptor #7.#14 // :(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V + 14: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Derived;" + 19: FieldReference #1.#20 // demo/AllJavaSyntaxes$Derived.this$0:Ldemo/AllJavaSyntaxes; + 20: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 21: MethodReference #3.#22 // demo/AllJavaSyntaxes$Base.:()V + 22: NameAndTypeDescriptor #7.#23 // :()V + 23: Utf8StringConstant "()V" + 24: Utf8StringConstant "s" + 25: Utf8StringConstant "Ljava/lang/String;" + 26: Utf8StringConstant "value" + 27: Utf8StringConstant "()Ljava/lang/String;" + 28: MethodReference #3.#29 // demo/AllJavaSyntaxes$Base.value:()Ljava/lang/String; + 29: NameAndTypeDescriptor #26.#27 // value:()Ljava/lang/String; + 30: Utf8StringConstant "qualifiedThis" + 31: StringConstant #32 // "qualified" + 32: Utf8StringConstant "qualified" + 33: MethodReference #34.#36 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 34: TypeInfo #35 // demo/AllJavaSyntaxes + 35: Utf8StringConstant "demo/AllJavaSyntaxes" + 36: NameAndTypeDescriptor #37.#38 // log:(Ljava/lang/String;)V + 37: Utf8StringConstant "log" + 38: Utf8StringConstant "(Ljava/lang/String;)V" + 39: Utf8StringConstant "SourceFile" + 40: Utf8StringConstant "AllJavaSyntaxes.java" + 41: Utf8StringConstant "InnerClasses" + 42: Utf8StringConstant "Base" + 43: Utf8StringConstant "Derived" + 44: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=3, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: ldc "x" + 4: invokespecial demo/AllJavaSyntaxes$Derived.:(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 8 0 this Ldemo/AllJavaSyntaxes$Derived; + void (demo.AllJavaSyntaxes p0, java.lang.String s); + Code: + stack=2, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Derived.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial demo/AllJavaSyntaxes$Base.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Derived; + 0 10 2 s Ljava/lang/String; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial demo/AllJavaSyntaxes$Base.value:()Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 5 0 this Ldemo/AllJavaSyntaxes$Derived; + void qualifiedThis(); + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Derived.this$0:Ldemo/AllJavaSyntaxes; + 4: ldc "qualified" + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Derived; +class demo.AllJavaSyntaxes.Entity + Minor version: 0 + Major version: 69 + Flags: STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Object;Ldemo/AllJavaSyntaxes$Named;Ldemo/AllJavaSyntaxes$Identified;Ljava/lang/Comparable; + InnerClasses: + static Entity = demo/AllJavaSyntaxes$Entity of demo/AllJavaSyntaxes + abstract static interface Identified = demo/AllJavaSyntaxes$Identified of demo/AllJavaSyntaxes + abstract static interface Named = demo/AllJavaSyntaxes$Named of demo/AllJavaSyntaxes + NestHost: 00 48 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Entity + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Entity" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // demo/AllJavaSyntaxes$Named + 6: Utf8StringConstant "demo/AllJavaSyntaxes$Named" + 7: TypeInfo #8 // demo/AllJavaSyntaxes$Identified + 8: Utf8StringConstant "demo/AllJavaSyntaxes$Identified" + 9: TypeInfo #10 // java/lang/Comparable + 10: Utf8StringConstant "java/lang/Comparable" + 11: Utf8StringConstant "id" + 12: Utf8StringConstant "J" + 13: Utf8StringConstant "name" + 14: Utf8StringConstant "Ljava/lang/String;" + 15: Utf8StringConstant "" + 16: Utf8StringConstant "(JLjava/lang/String;)V" + 17: Utf8StringConstant "Code" + 18: MethodReference #3.#19 // java/lang/Object.:()V + 19: NameAndTypeDescriptor #15.#20 // :()V + 20: Utf8StringConstant "()V" + 21: FieldReference #1.#22 // demo/AllJavaSyntaxes$Entity.id:J + 22: NameAndTypeDescriptor #11.#12 // id:J + 23: FieldReference #1.#24 // demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 24: NameAndTypeDescriptor #13.#14 // name:Ljava/lang/String; + 25: Utf8StringConstant "LineNumberTable" + 26: Utf8StringConstant "LocalVariableTable" + 27: Utf8StringConstant "this" + 28: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Entity;" + 29: Utf8StringConstant "()Ljava/lang/String;" + 30: Utf8StringConstant "()J" + 31: Utf8StringConstant "hashCode" + 32: Utf8StringConstant "()I" + 33: MethodReference #34.#36 // java/lang/Long.valueOf:(J)Ljava/lang/Long; + 34: TypeInfo #35 // java/lang/Long + 35: Utf8StringConstant "java/lang/Long" + 36: NameAndTypeDescriptor #37.#38 // valueOf:(J)Ljava/lang/Long; + 37: Utf8StringConstant "valueOf" + 38: Utf8StringConstant "(J)Ljava/lang/Long;" + 39: MethodReference #40.#42 // java/util/Objects.hash:([Ljava/lang/Object;)I + 40: TypeInfo #41 // java/util/Objects + 41: Utf8StringConstant "java/util/Objects" + 42: NameAndTypeDescriptor #43.#44 // hash:([Ljava/lang/Object;)I + 43: Utf8StringConstant "hash" + 44: Utf8StringConstant "([Ljava/lang/Object;)I" + 45: Utf8StringConstant "equals" + 46: Utf8StringConstant "(Ljava/lang/Object;)Z" + 47: MethodReference #3.#48 // java/lang/Object.getClass:()Ljava/lang/Class; + 48: NameAndTypeDescriptor #49.#50 // getClass:()Ljava/lang/Class; + 49: Utf8StringConstant "getClass" + 50: Utf8StringConstant "()Ljava/lang/Class;" + 51: MethodReference #40.#52 // java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z + 52: NameAndTypeDescriptor #45.#53 // equals:(Ljava/lang/Object;Ljava/lang/Object;)Z + 53: Utf8StringConstant "(Ljava/lang/Object;Ljava/lang/Object;)Z" + 54: Utf8StringConstant "obj" + 55: Utf8StringConstant "Ljava/lang/Object;" + 56: Utf8StringConstant "other" + 57: Utf8StringConstant "StackMapTable" + 58: Utf8StringConstant "compareTo" + 59: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Entity;)I" + 60: MethodReference #34.#61 // java/lang/Long.compare:(JJ)I + 61: NameAndTypeDescriptor #62.#63 // compare:(JJ)I + 62: Utf8StringConstant "compare" + 63: Utf8StringConstant "(JJ)I" + 64: Utf8StringConstant "(Ljava/lang/Object;)I" + 65: MethodReference #1.#66 // demo/AllJavaSyntaxes$Entity.compareTo:(Ldemo/AllJavaSyntaxes$Entity;)I + 66: NameAndTypeDescriptor #58.#59 // compareTo:(Ldemo/AllJavaSyntaxes$Entity;)I + 67: Utf8StringConstant "SourceFile" + 68: Utf8StringConstant "AllJavaSyntaxes.java" + 69: Utf8StringConstant "Signature" + 70: Utf8StringConstant "Ljava/lang/Object;Ldemo/AllJavaSyntaxes$Named;Ldemo/AllJavaSyntaxes$Identified;Ljava/lang/Comparable;" + 71: Utf8StringConstant "InnerClasses" + 72: TypeInfo #73 // demo/AllJavaSyntaxes + 73: Utf8StringConstant "demo/AllJavaSyntaxes" + 74: Utf8StringConstant "Entity" + 75: Utf8StringConstant "Identified" + 76: Utf8StringConstant "Named" + 77: Utf8StringConstant "NestHost" + private long id; + Flags: PRIVATE + private java.lang.String name; + Flags: PRIVATE + void (long id, java.lang.String name); + Code: + stack=3, locals=4, arguments=2 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: aload_0 /* this */ + 5: lload_1 /* id */ + 6: putfield demo/AllJavaSyntaxes$Entity.id:J + 9: aload_0 /* this */ + 10: aload_3 + 11: putfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 15 0 this Ldemo/AllJavaSyntaxes$Entity; + 0 15 1 id J + 0 15 3 name Ljava/lang/String; + public java.lang.String name(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Entity; + public long id(); + Flags: PUBLIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Entity.id:J + 4: lreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Entity; + public int hashCode(); + Flags: PUBLIC + Code: + stack=5, locals=1, arguments=0 + 0: iconst_2 + 1: anewarray Ljava/lang/Object; + 4: dup + 5: iconst_0 + 6: aload_0 /* this */ + 7: getfield demo/AllJavaSyntaxes$Entity.id:J + 10: invokestatic java/lang/Long.valueOf:(J)Ljava/lang/Long; + 13: aastore + 14: dup + 15: iconst_1 + 16: aload_0 /* this */ + 17: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 20: aastore + 21: invokestatic java/util/Objects.hash:([Ljava/lang/Object;)I + 24: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes$Entity; + public boolean equals(java.lang.Object obj); + Flags: PUBLIC + Code: + stack=4, locals=3, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* obj */ + 2: if_acmpne 7 + 5: iconst_1 + 6: ireturn + 7: aload_1 /* obj */ + 8: ifnonnull 13 + 11: iconst_0 + 12: ireturn + 13: aload_0 /* this */ + 14: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 17: aload_1 /* obj */ + 18: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 21: if_acmpeq 26 + 24: iconst_0 + 25: ireturn + 26: aload_1 /* obj */ + 27: checkcast Ldemo/AllJavaSyntaxes$Entity; + 30: astore_2 /* other */ + 31: aload_0 /* this */ + 32: getfield demo/AllJavaSyntaxes$Entity.id:J + 35: aload_2 /* other */ + 36: getfield demo/AllJavaSyntaxes$Entity.id:J + 39: lcmp + 40: ifne 59 + 43: aload_0 /* this */ + 44: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 47: aload_2 /* other */ + 48: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 51: invokestatic java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z + 54: ifeq 59 + 57: iconst_1 + 58: ireturn + 59: iconst_0 + 60: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------- + 0 61 0 this Ldemo/AllJavaSyntaxes$Entity; + 0 61 1 obj Ljava/lang/Object; + 31 30 2 other Ldemo/AllJavaSyntaxes$Entity; + StackMapTable: 00 04 07 05 0C FC 00 20 07 00 01 + public int compareTo(demo.AllJavaSyntaxes.Entity other); + Flags: PUBLIC + Code: + stack=4, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Entity.id:J + 4: aload_1 /* other */ + 5: getfield demo/AllJavaSyntaxes$Entity.id:J + 8: invokestatic java/lang/Long.compare:(JJ)I + 11: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------- + 0 12 0 this Ldemo/AllJavaSyntaxes$Entity; + 0 12 1 other Ldemo/AllJavaSyntaxes$Entity; + public int compareTo(java.lang.Object p0); + Flags: PUBLIC, BRIDGE, SYNTHETIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 + 1: aload_1 + 2: checkcast Ldemo/AllJavaSyntaxes$Entity; + 5: invokevirtual demo/AllJavaSyntaxes$Entity.compareTo:(Ldemo/AllJavaSyntaxes$Entity;)I + 8: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +interface demo.AllJavaSyntaxes.Named + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Named = demo/AllJavaSyntaxes$Named of demo/AllJavaSyntaxes + NestHost: 00 0A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Named + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Named" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "name" + 6: Utf8StringConstant "()Ljava/lang/String;" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "InnerClasses" + 10: TypeInfo #11 // demo/AllJavaSyntaxes + 11: Utf8StringConstant "demo/AllJavaSyntaxes" + 12: Utf8StringConstant "Named" + 13: Utf8StringConstant "NestHost" + public abstract java.lang.String name(); + Flags: PUBLIC, ABSTRACT +interface demo.AllJavaSyntaxes.Identified + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Identified = demo/AllJavaSyntaxes$Identified of demo/AllJavaSyntaxes + NestHost: 00 0A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Identified + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Identified" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "id" + 6: Utf8StringConstant "()J" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "InnerClasses" + 10: TypeInfo #11 // demo/AllJavaSyntaxes + 11: Utf8StringConstant "demo/AllJavaSyntaxes" + 12: Utf8StringConstant "Identified" + 13: Utf8StringConstant "NestHost" + public abstract long id(); + Flags: PUBLIC, ABSTRACT +class demo.AllJavaSyntaxes.Failure + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$Result; + InnerClasses: + static final Failure = demo/AllJavaSyntaxes$Failure of demo/AllJavaSyntaxes + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + NestHost: 00 1B + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Failure + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Failure" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Result + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 5: Utf8StringConstant "exception" + 6: Utf8StringConstant "Ljava/lang/Exception;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ljava/lang/Exception;)V" + 9: Utf8StringConstant "Code" + 10: MethodReference #3.#11 // demo/AllJavaSyntaxes$Result.:()V + 11: NameAndTypeDescriptor #7.#12 // :()V + 12: Utf8StringConstant "()V" + 13: FieldReference #1.#14 // demo/AllJavaSyntaxes$Failure.exception:Ljava/lang/Exception; + 14: NameAndTypeDescriptor #5.#6 // exception:Ljava/lang/Exception; + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 19: Utf8StringConstant "LocalVariableTypeTable" + 20: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 21: Utf8StringConstant "()Ljava/lang/Exception;" + 22: Utf8StringConstant "SourceFile" + 23: Utf8StringConstant "AllJavaSyntaxes.java" + 24: Utf8StringConstant "Signature" + 25: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 26: Utf8StringConstant "InnerClasses" + 27: TypeInfo #28 // demo/AllJavaSyntaxes + 28: Utf8StringConstant "demo/AllJavaSyntaxes" + 29: Utf8StringConstant "Failure" + 30: Utf8StringConstant "Result" + 31: Utf8StringConstant "NestHost" + private final java.lang.Exception exception; + Flags: PRIVATE, FINAL + void (java.lang.Exception exception); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial demo/AllJavaSyntaxes$Result.:()V + 4: aload_0 /* this */ + 5: aload_1 /* exception */ + 6: putfield demo/AllJavaSyntaxes$Failure.exception:Ljava/lang/Exception; + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Failure; + 0 10 1 exception Ljava/lang/Exception; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Failure; + java.lang.Exception exception(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Failure.exception:Ljava/lang/Exception; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 5 0 this Ldemo/AllJavaSyntaxes$Failure; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Failure; +class demo.AllJavaSyntaxes.Result + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, SEALED, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Object; + PermittedSubclasses: demo/AllJavaSyntaxes$Success, demo/AllJavaSyntaxes$Failure + InnerClasses: + static final Failure = demo/AllJavaSyntaxes$Failure of demo/AllJavaSyntaxes + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + static final Success = demo/AllJavaSyntaxes$Success of demo/AllJavaSyntaxes + NestHost: 00 1A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Result + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 14: Utf8StringConstant "LocalVariableTypeTable" + 15: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 16: Utf8StringConstant "SourceFile" + 17: Utf8StringConstant "AllJavaSyntaxes.java" + 18: Utf8StringConstant "Signature" + 19: Utf8StringConstant "Ljava/lang/Object;" + 20: Utf8StringConstant "PermittedSubclasses" + 21: TypeInfo #22 // demo/AllJavaSyntaxes$Success + 22: Utf8StringConstant "demo/AllJavaSyntaxes$Success" + 23: TypeInfo #24 // demo/AllJavaSyntaxes$Failure + 24: Utf8StringConstant "demo/AllJavaSyntaxes$Failure" + 25: Utf8StringConstant "InnerClasses" + 26: TypeInfo #27 // demo/AllJavaSyntaxes + 27: Utf8StringConstant "demo/AllJavaSyntaxes" + 28: Utf8StringConstant "Failure" + 29: Utf8StringConstant "Result" + 30: Utf8StringConstant "Success" + 31: Utf8StringConstant "NestHost" + private void (); + Flags: PRIVATE + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Result; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Result; +class demo.AllJavaSyntaxes.Success + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$Result; + InnerClasses: + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + static final Success = demo/AllJavaSyntaxes$Success of demo/AllJavaSyntaxes + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Success + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Success" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Result + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 5: Utf8StringConstant "value" + 6: Utf8StringConstant "Ljava/lang/Object;" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "TT;" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(Ljava/lang/Object;)V" + 11: Utf8StringConstant "(TT;)V" + 12: Utf8StringConstant "Code" + 13: MethodReference #3.#14 // demo/AllJavaSyntaxes$Result.:()V + 14: NameAndTypeDescriptor #9.#15 // :()V + 15: Utf8StringConstant "()V" + 16: FieldReference #1.#17 // demo/AllJavaSyntaxes$Success.value:Ljava/lang/Object; + 17: NameAndTypeDescriptor #5.#6 // value:Ljava/lang/Object; + 18: Utf8StringConstant "LineNumberTable" + 19: Utf8StringConstant "LocalVariableTable" + 20: Utf8StringConstant "this" + 21: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 22: Utf8StringConstant "LocalVariableTypeTable" + 23: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 24: Utf8StringConstant "()Ljava/lang/Object;" + 25: Utf8StringConstant "()TT;" + 26: Utf8StringConstant "SourceFile" + 27: Utf8StringConstant "AllJavaSyntaxes.java" + 28: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 29: Utf8StringConstant "InnerClasses" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "Result" + 33: Utf8StringConstant "Success" + 34: Utf8StringConstant "NestHost" + private final T value; + Flags: PRIVATE, FINAL + Signature: TT; + void (T value); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial demo/AllJavaSyntaxes$Result.:()V + 4: aload_0 /* this */ + 5: aload_1 /* value */ + 6: putfield demo/AllJavaSyntaxes$Success.value:Ljava/lang/Object; + 9: return + Signature: + (TT;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Success; + 0 10 1 value Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Success; + 0 10 1 value TT; + T value(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Success.value:Ljava/lang/Object; + 4: areturn + Signature: + ()TT; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 5 0 this Ldemo/AllJavaSyntaxes$Success; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Success; +class demo.AllJavaSyntaxes.GenericConstructor + Minor version: 0 + Major version: 69 + Flags: STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static GenericConstructor = demo/AllJavaSyntaxes$GenericConstructor of demo/AllJavaSyntaxes + NestHost: 00 18 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$GenericConstructor + 2: Utf8StringConstant "demo/AllJavaSyntaxes$GenericConstructor" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "(Ljava/lang/Object;)V" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "(TT;)V" + 9: Utf8StringConstant "Code" + 10: MethodReference #3.#11 // java/lang/Object.:()V + 11: NameAndTypeDescriptor #5.#12 // :()V + 12: Utf8StringConstant "()V" + 13: Utf8StringConstant "LineNumberTable" + 14: Utf8StringConstant "LocalVariableTable" + 15: Utf8StringConstant "this" + 16: Utf8StringConstant "Ldemo/AllJavaSyntaxes$GenericConstructor;" + 17: Utf8StringConstant "value" + 18: Utf8StringConstant "Ljava/lang/Object;" + 19: Utf8StringConstant "LocalVariableTypeTable" + 20: Utf8StringConstant "TT;" + 21: Utf8StringConstant "SourceFile" + 22: Utf8StringConstant "AllJavaSyntaxes.java" + 23: Utf8StringConstant "InnerClasses" + 24: TypeInfo #25 // demo/AllJavaSyntaxes + 25: Utf8StringConstant "demo/AllJavaSyntaxes" + 26: Utf8StringConstant "GenericConstructor" + 27: Utf8StringConstant "NestHost" + void (T value); + Code: + stack=1, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + Signature: + (TT;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$GenericConstructor; + 0 5 1 value Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------- + 0 5 1 value TT; +class demo.AllJavaSyntaxes.Inner + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + BootstrapMethods: + 0: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()V + invokespecial demo/AllJavaSyntaxes$Inner.lambda$0:()V + ()V + InnerClasses: + Inner = demo/AllJavaSyntaxes$Inner of demo/AllJavaSyntaxes + demo/AllJavaSyntaxes$Inner$1 + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestHost: 00 12 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Inner + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Inner" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: StringConstant #16 // "Inner constructor" + 16: Utf8StringConstant "Inner constructor" + 17: MethodReference #18.#20 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 18: TypeInfo #19 // demo/AllJavaSyntaxes + 19: Utf8StringConstant "demo/AllJavaSyntaxes" + 20: NameAndTypeDescriptor #21.#22 // log:(Ljava/lang/String;)V + 21: Utf8StringConstant "log" + 22: Utf8StringConstant "(Ljava/lang/String;)V" + 23: Utf8StringConstant "LineNumberTable" + 24: Utf8StringConstant "LocalVariableTable" + 25: Utf8StringConstant "this" + 26: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Inner;" + 27: Utf8StringConstant "anonymousClass" + 28: TypeInfo #29 // java/lang/Thread + 29: Utf8StringConstant "java/lang/Thread" + 30: TypeInfo #31 // demo/AllJavaSyntaxes$Inner$1 + 31: Utf8StringConstant "demo/AllJavaSyntaxes$Inner$1" + 32: MethodReference #30.#33 // demo/AllJavaSyntaxes$Inner$1.:(Ldemo/AllJavaSyntaxes$Inner;)V + 33: NameAndTypeDescriptor #7.#34 // :(Ldemo/AllJavaSyntaxes$Inner;)V + 34: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)V" + 35: MethodReference #28.#36 // java/lang/Thread.:(Ljava/lang/Runnable;)V + 36: NameAndTypeDescriptor #7.#37 // :(Ljava/lang/Runnable;)V + 37: Utf8StringConstant "(Ljava/lang/Runnable;)V" + 38: MethodReference #28.#39 // java/lang/Thread.start:()V + 39: NameAndTypeDescriptor #40.#14 // start:()V + 40: Utf8StringConstant "start" + 41: Utf8StringConstant "lambda" + 42: InvokeDynamicInfo 0, #44.#45 // run:(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable; + 43: NameAndTypeDescriptor #44.#45 // run:(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable; + 44: Utf8StringConstant "run" + 45: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable;" + 46: Utf8StringConstant "access$0" + 47: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes;" + 48: Utf8StringConstant "lambda$0" + 49: StringConstant #50 // "Inner.lambda" + 50: Utf8StringConstant "Inner.lambda" + 51: Utf8StringConstant "SourceFile" + 52: Utf8StringConstant "AllJavaSyntaxes.java" + 53: Utf8StringConstant "BootstrapMethods" + 54: MethodReference #55.#57 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 55: TypeInfo #56 // java/lang/invoke/LambdaMetafactory + 56: Utf8StringConstant "java/lang/invoke/LambdaMetafactory" + 57: NameAndTypeDescriptor #58.#59 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 58: Utf8StringConstant "metafactory" + 59: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" + 60: MethodHandle InvokeStatic #55.#57 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 61: MethodType ()V + 62: MethodReference #1.#63 // demo/AllJavaSyntaxes$Inner.lambda$0:()V + 63: NameAndTypeDescriptor #48.#14 // lambda$0:()V + 64: MethodHandle InvokeSpecial #1.#63 // demo/AllJavaSyntaxes$Inner.lambda$0:()V + 65: MethodType ()V + 66: Utf8StringConstant "InnerClasses" + 67: Utf8StringConstant "Inner" + 68: TypeInfo #69 // java/lang/invoke/MethodHandles$Lookup + 69: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 70: TypeInfo #71 // java/lang/invoke/MethodHandles + 71: Utf8StringConstant "java/lang/invoke/MethodHandles" + 72: Utf8StringConstant "Lookup" + 73: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_1 + 10: ldc "Inner constructor" + 12: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 15: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 16 0 this Ldemo/AllJavaSyntaxes$Inner; + void anonymousClass(); + Code: + stack=5, locals=1, arguments=0 + 0: new Ljava/lang/Thread; + 3: dup + 4: new Ldemo/AllJavaSyntaxes$Inner$1; + 7: dup + 8: aload_0 /* this */ + 9: invokespecial demo/AllJavaSyntaxes$Inner$1.:(Ldemo/AllJavaSyntaxes$Inner;)V + 12: invokespecial java/lang/Thread.:(Ljava/lang/Runnable;)V + 15: invokevirtual java/lang/Thread.start:()V + 18: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 19 0 this Ldemo/AllJavaSyntaxes$Inner; + void lambda(); + Code: + stack=3, locals=1, arguments=0 + 0: new Ljava/lang/Thread; + 3: dup + 4: aload_0 /* this */ + 5: invokedynamic BootstrapMethod #0, run:(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable; + 10: invokespecial java/lang/Thread.:(Ljava/lang/Runnable;)V + 13: invokevirtual java/lang/Thread.start:()V + 16: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 17 0 this Ldemo/AllJavaSyntaxes$Inner; + static demo.AllJavaSyntaxes access$0(demo.AllJavaSyntaxes.Inner p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void lambda$0(); + Flags: PRIVATE, SYNTHETIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 4: ldc "Inner.lambda" + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Inner; +class demo.AllJavaSyntaxes$Inner$1demo.AllJavaSyntaxes.Inner.AllJavaSyntaxes$Inner$1 + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes$Inner + EnclosingMethod: demo/AllJavaSyntaxes$Inner.anonymousClass:()V + BootstrapMethods: + 0: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "index=\u0001,constant=1" + InnerClasses: + Inner = demo/AllJavaSyntaxes$Inner of demo/AllJavaSyntaxes + demo/AllJavaSyntaxes$Inner$1 + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestHost: 00 2A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Inner$1 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Inner$1" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/Runnable + 6: Utf8StringConstant "java/lang/Runnable" + 7: Utf8StringConstant "CONSTANT" + 8: Utf8StringConstant "J" + 9: Utf8StringConstant "ConstantValue" + 10: LongConstant 1L + 12: Utf8StringConstant "index" + 13: Utf8StringConstant "I" + 14: Utf8StringConstant "this$1" + 15: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Inner;" + 16: Utf8StringConstant "" + 17: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)V" + 18: Utf8StringConstant "Code" + 19: FieldReference #1.#20 // demo/AllJavaSyntaxes$Inner$1.this$1:Ldemo/AllJavaSyntaxes$Inner; + 20: NameAndTypeDescriptor #14.#15 // this$1:Ldemo/AllJavaSyntaxes$Inner; + 21: MethodReference #3.#22 // java/lang/Object.:()V + 22: NameAndTypeDescriptor #16.#23 // :()V + 23: Utf8StringConstant "()V" + 24: FieldReference #1.#25 // demo/AllJavaSyntaxes$Inner$1.index:I + 25: NameAndTypeDescriptor #12.#13 // index:I + 26: Utf8StringConstant "LineNumberTable" + 27: Utf8StringConstant "LocalVariableTable" + 28: Utf8StringConstant "this" + 29: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Inner$1;" + 30: Utf8StringConstant "run" + 31: MethodReference #32.#34 // demo/AllJavaSyntaxes$Inner.access$0:(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes; + 32: TypeInfo #33 // demo/AllJavaSyntaxes$Inner + 33: Utf8StringConstant "demo/AllJavaSyntaxes$Inner" + 34: NameAndTypeDescriptor #35.#36 // access$0:(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes; + 35: Utf8StringConstant "access$0" + 36: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes;" + 37: InvokeDynamicInfo 0, #39.#40 // makeConcatWithConstants:(I)Ljava/lang/String; + 38: NameAndTypeDescriptor #39.#40 // makeConcatWithConstants:(I)Ljava/lang/String; + 39: Utf8StringConstant "makeConcatWithConstants" + 40: Utf8StringConstant "(I)Ljava/lang/String;" + 41: MethodReference #42.#44 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 42: TypeInfo #43 // demo/AllJavaSyntaxes + 43: Utf8StringConstant "demo/AllJavaSyntaxes" + 44: NameAndTypeDescriptor #45.#46 // log:(Ljava/lang/String;)V + 45: Utf8StringConstant "log" + 46: Utf8StringConstant "(Ljava/lang/String;)V" + 47: Utf8StringConstant "SourceFile" + 48: Utf8StringConstant "AllJavaSyntaxes.java" + 49: Utf8StringConstant "EnclosingMethod" + 50: NameAndTypeDescriptor #51.#23 // anonymousClass:()V + 51: Utf8StringConstant "anonymousClass" + 52: Utf8StringConstant "BootstrapMethods" + 53: MethodReference #54.#56 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 54: TypeInfo #55 // java/lang/invoke/StringConcatFactory + 55: Utf8StringConstant "java/lang/invoke/StringConcatFactory" + 56: NameAndTypeDescriptor #39.#57 // makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 57: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" + 58: MethodHandle InvokeStatic #54.#56 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 59: StringConstant #60 // "index=\u0001,constant=1" + 60: Utf8StringConstant "index=\u0001,constant=1" + 61: Utf8StringConstant "InnerClasses" + 62: Utf8StringConstant "Inner" + 63: TypeInfo #64 // java/lang/invoke/MethodHandles$Lookup + 64: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 65: TypeInfo #66 // java/lang/invoke/MethodHandles + 66: Utf8StringConstant "java/lang/invoke/MethodHandles" + 67: Utf8StringConstant "Lookup" + 68: Utf8StringConstant "NestHost" + private static final long CONSTANT; + Flags: PRIVATE, STATIC, FINAL + ConstantValue: long 1L + int index; + final demo.AllJavaSyntaxes.Inner this$1; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.Inner p0); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Inner$1.this$1:Ldemo/AllJavaSyntaxes$Inner; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_0 /* this */ + 10: iconst_m1 + 11: putfield demo/AllJavaSyntaxes$Inner$1.index:I + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 15 0 this Ldemo/AllJavaSyntaxes$Inner$1; + public void run(); + Flags: PUBLIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Inner$1.this$1:Ldemo/AllJavaSyntaxes$Inner; + 4: invokestatic demo/AllJavaSyntaxes$Inner.access$0:(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes; + 7: aload_0 /* this */ + 8: getfield demo/AllJavaSyntaxes$Inner$1.index:I + 11: invokedynamic BootstrapMethod #0, makeConcatWithConstants:(I)Ljava/lang/String; + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 20 0 this Ldemo/AllJavaSyntaxes$Inner$1; +@interface demo.AllJavaSyntaxes.Marker + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Marker = demo/AllJavaSyntaxes$Marker of demo/AllJavaSyntaxes + NestHost: 00 13 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Marker + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Marker" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "RuntimeVisibleAnnotations" + 10: Utf8StringConstant "Ljava/lang/annotation/Retention;" + 11: Utf8StringConstant "value" + 12: Utf8StringConstant "Ljava/lang/annotation/RetentionPolicy;" + 13: Utf8StringConstant "RUNTIME" + 14: Utf8StringConstant "Ljava/lang/annotation/Target;" + 15: Utf8StringConstant "Ljava/lang/annotation/ElementType;" + 16: Utf8StringConstant "TYPE" + 17: Utf8StringConstant "METHOD" + 18: Utf8StringConstant "InnerClasses" + 19: TypeInfo #20 // demo/AllJavaSyntaxes + 20: Utf8StringConstant "demo/AllJavaSyntaxes" + 21: Utf8StringConstant "Marker" + 22: Utf8StringConstant "NestHost" +enum demo.AllJavaSyntaxes.Operation + Minor version: 0 + Major version: 69 + Flags: STATIC, SEALED, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Enum; + PermittedSubclasses: demo/AllJavaSyntaxes$Operation$1, demo/AllJavaSyntaxes$Operation$2 + InnerClasses: + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + final enum demo/AllJavaSyntaxes$Operation$1 + final enum demo/AllJavaSyntaxes$Operation$2 + NestHost: 00 37 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Operation + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 3: TypeInfo #4 // java/lang/Enum + 4: Utf8StringConstant "java/lang/Enum" + 5: Utf8StringConstant "ADD" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Operation;" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "SUB" + 9: Utf8StringConstant "ENUM$VALUES" + 10: Utf8StringConstant "[Ldemo/AllJavaSyntaxes$Operation;" + 11: Utf8StringConstant "" + 12: Utf8StringConstant "()V" + 13: Utf8StringConstant "Code" + 14: TypeInfo #15 // demo/AllJavaSyntaxes$Operation$1 + 15: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$1" + 16: StringConstant #5 // "ADD" + 17: MethodReference #14.#18 // demo/AllJavaSyntaxes$Operation$1.:(Ljava/lang/String;I)V + 18: NameAndTypeDescriptor #19.#20 // :(Ljava/lang/String;I)V + 19: Utf8StringConstant "" + 20: Utf8StringConstant "(Ljava/lang/String;I)V" + 21: FieldReference #1.#22 // demo/AllJavaSyntaxes$Operation.ADD:Ldemo/AllJavaSyntaxes$Operation; + 22: NameAndTypeDescriptor #5.#6 // ADD:Ldemo/AllJavaSyntaxes$Operation; + 23: TypeInfo #24 // demo/AllJavaSyntaxes$Operation$2 + 24: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$2" + 25: StringConstant #8 // "SUB" + 26: MethodReference #23.#18 // demo/AllJavaSyntaxes$Operation$2.:(Ljava/lang/String;I)V + 27: FieldReference #1.#28 // demo/AllJavaSyntaxes$Operation.SUB:Ldemo/AllJavaSyntaxes$Operation; + 28: NameAndTypeDescriptor #8.#6 // SUB:Ldemo/AllJavaSyntaxes$Operation; + 29: FieldReference #1.#30 // demo/AllJavaSyntaxes$Operation.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 30: NameAndTypeDescriptor #9.#10 // ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 31: Utf8StringConstant "LineNumberTable" + 32: Utf8StringConstant "LocalVariableTable" + 33: MethodReference #3.#18 // java/lang/Enum.:(Ljava/lang/String;I)V + 34: Utf8StringConstant "this" + 35: Utf8StringConstant "apply" + 36: Utf8StringConstant "(II)I" + 37: Utf8StringConstant "values" + 38: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Operation;" + 39: MethodReference #40.#42 // java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 40: TypeInfo #41 // java/lang/System + 41: Utf8StringConstant "java/lang/System" + 42: NameAndTypeDescriptor #43.#44 // arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 43: Utf8StringConstant "arraycopy" + 44: Utf8StringConstant "(Ljava/lang/Object;ILjava/lang/Object;II)V" + 45: Utf8StringConstant "valueOf" + 46: Utf8StringConstant "(Ljava/lang/String;)Ldemo/AllJavaSyntaxes$Operation;" + 47: MethodReference #3.#48 // java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 48: NameAndTypeDescriptor #45.#49 // valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 49: Utf8StringConstant "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;" + 50: Utf8StringConstant "SourceFile" + 51: Utf8StringConstant "AllJavaSyntaxes.java" + 52: Utf8StringConstant "Ljava/lang/Enum;" + 53: Utf8StringConstant "PermittedSubclasses" + 54: Utf8StringConstant "InnerClasses" + 55: TypeInfo #56 // demo/AllJavaSyntaxes + 56: Utf8StringConstant "demo/AllJavaSyntaxes" + 57: Utf8StringConstant "Operation" + 58: Utf8StringConstant "NestHost" + public static final demo.AllJavaSyntaxes.Operation ADD; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Operation; + public static final demo.AllJavaSyntaxes.Operation SUB; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Operation; + private static final demo.AllJavaSyntaxes.Operation[] ENUM$VALUES; + Flags: PRIVATE, STATIC, FINAL, SYNTHETIC + static {}; + Flags: STATIC + Code: + stack=4, locals=0, arguments=0 + 0: new Ldemo/AllJavaSyntaxes$Operation$1; + 3: dup + 4: ldc "ADD" + 6: iconst_0 + 7: invokespecial demo/AllJavaSyntaxes$Operation$1.:(Ljava/lang/String;I)V + 10: putstatic demo/AllJavaSyntaxes$Operation.ADD:Ldemo/AllJavaSyntaxes$Operation; + 13: new Ldemo/AllJavaSyntaxes$Operation$2; + 16: dup + 17: ldc "SUB" + 19: iconst_1 + 20: invokespecial demo/AllJavaSyntaxes$Operation$2.:(Ljava/lang/String;I)V + 23: putstatic demo/AllJavaSyntaxes$Operation.SUB:Ldemo/AllJavaSyntaxes$Operation; + 26: iconst_2 + 27: anewarray Ldemo/AllJavaSyntaxes$Operation; + 30: dup + 31: iconst_0 + 32: getstatic demo/AllJavaSyntaxes$Operation.ADD:Ldemo/AllJavaSyntaxes$Operation; + 35: aastore + 36: dup + 37: iconst_1 + 38: getstatic demo/AllJavaSyntaxes$Operation.SUB:Ldemo/AllJavaSyntaxes$Operation; + 41: aastore + 42: putstatic demo/AllJavaSyntaxes$Operation.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 45: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void (java.lang.String p0, int p1); + Flags: PRIVATE + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial java/lang/Enum.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Operation; + native int apply(int p0, int p1); + Flags: NATIVE + public static demo.AllJavaSyntaxes.Operation[] values(); + Flags: PUBLIC, STATIC + Code: + stack=5, locals=3, arguments=0 + 0: getstatic demo/AllJavaSyntaxes$Operation.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 3: dup + 4: astore_0 + 5: iconst_0 + 6: aload_0 + 7: arraylength + 8: dup + 9: istore_1 + 10: anewarray Ldemo/AllJavaSyntaxes$Operation; + 13: dup + 14: astore_2 + 15: iconst_0 + 16: iload_1 + 17: invokestatic java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 20: aload_2 + 21: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public static demo.AllJavaSyntaxes.Operation valueOf(java.lang.String p0); + Flags: PUBLIC, STATIC + Code: + stack=2, locals=1, arguments=1 + 0: ldc Ldemo/AllJavaSyntaxes$Operation;.class + 2: aload_0 + 3: invokestatic java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 6: checkcast Ldemo/AllJavaSyntaxes$Operation; + 9: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +enum demo.AllJavaSyntaxes$Operation$1demo.AllJavaSyntaxes.Operation.AllJavaSyntaxes$Operation$1 + Minor version: 0 + Major version: 69 + Flags: FINAL, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes$Operation + InnerClasses: + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + final enum demo/AllJavaSyntaxes$Operation$1 + NestHost: 00 17 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Operation$1 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$1" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Operation + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "(Ljava/lang/String;I)V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 9: NameAndTypeDescriptor #5.#6 // :(Ljava/lang/String;I)V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Operation$1;" + 14: Utf8StringConstant "apply" + 15: Utf8StringConstant "(II)I" + 16: Utf8StringConstant "a" + 17: Utf8StringConstant "I" + 18: Utf8StringConstant "b" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "EnclosingMethod" + 22: Utf8StringConstant "InnerClasses" + 23: TypeInfo #24 // demo/AllJavaSyntaxes + 24: Utf8StringConstant "demo/AllJavaSyntaxes" + 25: Utf8StringConstant "Operation" + 26: Utf8StringConstant "NestHost" + void (java.lang.String p0, int p1); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Operation$1; + int apply(int a, int b); + Code: + stack=2, locals=3, arguments=2 + 0: iload_1 /* a */ + 1: iload_2 /* b */ + 2: iadd + 3: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes$Operation$1; + 0 4 1 a I + 0 4 2 b I +enum demo.AllJavaSyntaxes$Operation$2demo.AllJavaSyntaxes.Operation.AllJavaSyntaxes$Operation$2 + Minor version: 0 + Major version: 69 + Flags: FINAL, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes$Operation + InnerClasses: + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + final enum demo/AllJavaSyntaxes$Operation$2 + NestHost: 00 17 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Operation$2 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$2" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Operation + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "(Ljava/lang/String;I)V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 9: NameAndTypeDescriptor #5.#6 // :(Ljava/lang/String;I)V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Operation$2;" + 14: Utf8StringConstant "apply" + 15: Utf8StringConstant "(II)I" + 16: Utf8StringConstant "a" + 17: Utf8StringConstant "I" + 18: Utf8StringConstant "b" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "EnclosingMethod" + 22: Utf8StringConstant "InnerClasses" + 23: TypeInfo #24 // demo/AllJavaSyntaxes + 24: Utf8StringConstant "demo/AllJavaSyntaxes" + 25: Utf8StringConstant "Operation" + 26: Utf8StringConstant "NestHost" + void (java.lang.String p0, int p1); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Operation$2; + int apply(int a, int b); + Code: + stack=2, locals=3, arguments=2 + 0: iload_1 /* a */ + 1: iload_2 /* b */ + 2: isub + 3: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes$Operation$2; + 0 4 1 a I + 0 4 2 b I +class demo.AllJavaSyntaxes.Outer + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + static StaticNested = demo/AllJavaSyntaxes$Outer$StaticNested of demo/AllJavaSyntaxes$Outer + NestHost: 00 1C + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "value" + 6: Utf8StringConstant "I" + 7: Utf8StringConstant "this$0" + 8: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 11: Utf8StringConstant "Code" + 12: FieldReference #1.#13 // demo/AllJavaSyntaxes$Outer.this$0:Ldemo/AllJavaSyntaxes; + 13: NameAndTypeDescriptor #7.#8 // this$0:Ldemo/AllJavaSyntaxes; + 14: MethodReference #3.#15 // java/lang/Object.:()V + 15: NameAndTypeDescriptor #9.#16 // :()V + 16: Utf8StringConstant "()V" + 17: FieldReference #1.#18 // demo/AllJavaSyntaxes$Outer.value:I + 18: NameAndTypeDescriptor #5.#6 // value:I + 19: Utf8StringConstant "LineNumberTable" + 20: Utf8StringConstant "LocalVariableTable" + 21: Utf8StringConstant "this" + 22: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer;" + 23: Utf8StringConstant "access$0" + 24: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes;" + 25: Utf8StringConstant "SourceFile" + 26: Utf8StringConstant "AllJavaSyntaxes.java" + 27: Utf8StringConstant "InnerClasses" + 28: TypeInfo #29 // demo/AllJavaSyntaxes + 29: Utf8StringConstant "demo/AllJavaSyntaxes" + 30: Utf8StringConstant "Outer" + 31: TypeInfo #32 // demo/AllJavaSyntaxes$Outer$Inner + 32: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 33: Utf8StringConstant "Inner" + 34: TypeInfo #35 // demo/AllJavaSyntaxes$Outer$StaticNested + 35: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$StaticNested" + 36: Utf8StringConstant "StaticNested" + 37: Utf8StringConstant "NestHost" + int value; + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Outer.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_0 /* this */ + 10: iconst_1 + 11: putfield demo/AllJavaSyntaxes$Outer.value:I + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 15 0 this Ldemo/AllJavaSyntaxes$Outer; + static demo.AllJavaSyntaxes access$0(demo.AllJavaSyntaxes.Outer p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Outer.this$0:Ldemo/AllJavaSyntaxes; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.Outer.Inner + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + Deep = demo/AllJavaSyntaxes$Outer$Inner$Deep of demo/AllJavaSyntaxes$Outer$Inner + NestHost: 00 18 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer$Inner + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$1" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Outer$Inner.this$1:Ldemo/AllJavaSyntaxes$Outer; + 11: NameAndTypeDescriptor #5.#6 // this$1:Ldemo/AllJavaSyntaxes$Outer; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: MethodReference #16.#18 // demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 16: TypeInfo #17 // demo/AllJavaSyntaxes$Outer + 17: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 18: NameAndTypeDescriptor #19.#20 // access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 19: Utf8StringConstant "access$0" + 20: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes;" + 21: StringConstant #22 // "Inner" + 22: Utf8StringConstant "Inner" + 23: MethodReference #24.#26 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 24: TypeInfo #25 // demo/AllJavaSyntaxes + 25: Utf8StringConstant "demo/AllJavaSyntaxes" + 26: NameAndTypeDescriptor #27.#28 // log:(Ljava/lang/String;)V + 27: Utf8StringConstant "log" + 28: Utf8StringConstant "(Ljava/lang/String;)V" + 29: Utf8StringConstant "LineNumberTable" + 30: Utf8StringConstant "LocalVariableTable" + 31: Utf8StringConstant "this" + 32: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$Inner;" + 33: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer;" + 34: Utf8StringConstant "SourceFile" + 35: Utf8StringConstant "AllJavaSyntaxes.java" + 36: Utf8StringConstant "InnerClasses" + 37: Utf8StringConstant "Outer" + 38: TypeInfo #39 // demo/AllJavaSyntaxes$Outer$Inner$Deep + 39: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner$Deep" + 40: Utf8StringConstant "Deep" + 41: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes.Outer this$1; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.Outer p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Outer$Inner.this$1:Ldemo/AllJavaSyntaxes$Outer; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_1 + 10: invokestatic demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 13: ldc "Inner" + 15: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 18: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 19 0 this Ldemo/AllJavaSyntaxes$Outer$Inner; + static demo.AllJavaSyntaxes.Outer access$0(demo.AllJavaSyntaxes.Outer.Inner p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Outer$Inner.this$1:Ldemo/AllJavaSyntaxes$Outer; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.Outer.Inner.Deep + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + Deep = demo/AllJavaSyntaxes$Outer$Inner$Deep of demo/AllJavaSyntaxes$Outer$Inner + NestHost: 00 1D + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer$Inner$Deep + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner$Deep" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$2" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$Inner;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Outer$Inner$Deep.this$2:Ldemo/AllJavaSyntaxes$Outer$Inner; + 11: NameAndTypeDescriptor #5.#6 // this$2:Ldemo/AllJavaSyntaxes$Outer$Inner; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: MethodReference #16.#18 // demo/AllJavaSyntaxes$Outer$Inner.access$0:(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer; + 16: TypeInfo #17 // demo/AllJavaSyntaxes$Outer$Inner + 17: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 18: NameAndTypeDescriptor #19.#20 // access$0:(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer; + 19: Utf8StringConstant "access$0" + 20: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer;" + 21: MethodReference #22.#24 // demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 22: TypeInfo #23 // demo/AllJavaSyntaxes$Outer + 23: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 24: NameAndTypeDescriptor #19.#25 // access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 25: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes;" + 26: StringConstant #27 // "Deep" + 27: Utf8StringConstant "Deep" + 28: MethodReference #29.#31 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 29: TypeInfo #30 // demo/AllJavaSyntaxes + 30: Utf8StringConstant "demo/AllJavaSyntaxes" + 31: NameAndTypeDescriptor #32.#33 // log:(Ljava/lang/String;)V + 32: Utf8StringConstant "log" + 33: Utf8StringConstant "(Ljava/lang/String;)V" + 34: Utf8StringConstant "LineNumberTable" + 35: Utf8StringConstant "LocalVariableTable" + 36: Utf8StringConstant "this" + 37: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$Inner$Deep;" + 38: Utf8StringConstant "SourceFile" + 39: Utf8StringConstant "AllJavaSyntaxes.java" + 40: Utf8StringConstant "InnerClasses" + 41: Utf8StringConstant "Outer" + 42: Utf8StringConstant "Inner" + 43: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes.Outer.Inner this$2; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.Outer.Inner p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Outer$Inner$Deep.this$2:Ldemo/AllJavaSyntaxes$Outer$Inner; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_1 + 10: invokestatic demo/AllJavaSyntaxes$Outer$Inner.access$0:(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer; + 13: invokestatic demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 16: ldc "Deep" + 18: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 21: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------------- + 0 22 0 this Ldemo/AllJavaSyntaxes$Outer$Inner$Deep; +class demo.AllJavaSyntaxes.Outer.StaticNested + Minor version: 0 + Major version: 69 + Flags: STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + static StaticNested = demo/AllJavaSyntaxes$Outer$StaticNested of demo/AllJavaSyntaxes$Outer + NestHost: 00 21 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer$StaticNested + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$StaticNested" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: FieldReference #11.#13 // java/lang/System.out:Ljava/io/PrintStream; + 11: TypeInfo #12 // java/lang/System + 12: Utf8StringConstant "java/lang/System" + 13: NameAndTypeDescriptor #14.#15 // out:Ljava/io/PrintStream; + 14: Utf8StringConstant "out" + 15: Utf8StringConstant "Ljava/io/PrintStream;" + 16: StringConstant #17 // "StaticNested" + 17: Utf8StringConstant "StaticNested" + 18: MethodReference #19.#21 // java/io/PrintStream.println:(Ljava/lang/String;)V + 19: TypeInfo #20 // java/io/PrintStream + 20: Utf8StringConstant "java/io/PrintStream" + 21: NameAndTypeDescriptor #22.#23 // println:(Ljava/lang/String;)V + 22: Utf8StringConstant "println" + 23: Utf8StringConstant "(Ljava/lang/String;)V" + 24: Utf8StringConstant "LineNumberTable" + 25: Utf8StringConstant "LocalVariableTable" + 26: Utf8StringConstant "this" + 27: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$StaticNested;" + 28: Utf8StringConstant "SourceFile" + 29: Utf8StringConstant "AllJavaSyntaxes.java" + 30: Utf8StringConstant "InnerClasses" + 31: TypeInfo #32 // demo/AllJavaSyntaxes$Outer + 32: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 33: TypeInfo #34 // demo/AllJavaSyntaxes + 34: Utf8StringConstant "demo/AllJavaSyntaxes" + 35: Utf8StringConstant "Outer" + 36: Utf8StringConstant "NestHost" + void (); + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: getstatic java/lang/System.out:Ljava/io/PrintStream; + 7: ldc "StaticNested" + 9: invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)V + 12: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------------- + 0 13 0 this Ldemo/AllJavaSyntaxes$Outer$StaticNested; +class demo.AllJavaSyntaxes.Rec + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + BootstrapMethods: + 0: invokestatic java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + Arguments: + demo.AllJavaSyntaxes.Rec.class + "s;l" + getfield demo/AllJavaSyntaxes$Rec.s:()Ljava/lang/String; + getfield demo/AllJavaSyntaxes$Rec.l:()Ljava/util/List; + InnerClasses: + static final Rec = demo/AllJavaSyntaxes$Rec of demo/AllJavaSyntaxes + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestHost: 00 4A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Rec + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Rec" + 3: TypeInfo #4 // java/lang/Record + 4: Utf8StringConstant "java/lang/Record" + 5: Utf8StringConstant "s" + 6: Utf8StringConstant "Ljava/lang/String;" + 7: Utf8StringConstant "l" + 8: Utf8StringConstant "Ljava/util/List;" + 9: Utf8StringConstant "Signature" + 10: Utf8StringConstant "Ljava/util/List;" + 11: Utf8StringConstant "" + 12: Utf8StringConstant "(Ljava/lang/String;Ljava/util/List;)V" + 13: Utf8StringConstant "(Ljava/lang/String;Ljava/util/List;)V" + 14: Utf8StringConstant "Code" + 15: MethodReference #3.#16 // java/lang/Record.:()V + 16: NameAndTypeDescriptor #11.#17 // :()V + 17: Utf8StringConstant "()V" + 18: StringConstant #19 // "" + 19: Utf8StringConstant "" + 20: InterfaceMethodReference #21.#23 // java/util/List.of:()Ljava/util/List; + 21: TypeInfo #22 // java/util/List + 22: Utf8StringConstant "java/util/List" + 23: NameAndTypeDescriptor #24.#25 // of:()Ljava/util/List; + 24: Utf8StringConstant "of" + 25: Utf8StringConstant "()Ljava/util/List;" + 26: InterfaceMethodReference #21.#27 // java/util/List.copyOf:(Ljava/util/Collection;)Ljava/util/List; + 27: NameAndTypeDescriptor #28.#29 // copyOf:(Ljava/util/Collection;)Ljava/util/List; + 28: Utf8StringConstant "copyOf" + 29: Utf8StringConstant "(Ljava/util/Collection;)Ljava/util/List;" + 30: FieldReference #1.#31 // demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 31: NameAndTypeDescriptor #5.#6 // s:Ljava/lang/String; + 32: FieldReference #1.#33 // demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 33: NameAndTypeDescriptor #7.#8 // l:Ljava/util/List; + 34: Utf8StringConstant "LineNumberTable" + 35: Utf8StringConstant "LocalVariableTable" + 36: Utf8StringConstant "this" + 37: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Rec;" + 38: Utf8StringConstant "LocalVariableTypeTable" + 39: Utf8StringConstant "StackMapTable" + 40: TypeInfo #41 // java/lang/String + 41: Utf8StringConstant "java/lang/String" + 42: Utf8StringConstant "MethodParameters" + 43: Utf8StringConstant "()Ljava/lang/String;" + 44: Utf8StringConstant "()Ljava/util/List;" + 45: Utf8StringConstant "toString" + 46: InvokeDynamicInfo 0, #45.#48 // toString:(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String; + 47: NameAndTypeDescriptor #45.#48 // toString:(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String; + 48: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String;" + 49: Utf8StringConstant "hashCode" + 50: Utf8StringConstant "()I" + 51: InvokeDynamicInfo 0, #49.#53 // hashCode:(Ldemo/AllJavaSyntaxes$Rec;)I + 52: NameAndTypeDescriptor #49.#53 // hashCode:(Ldemo/AllJavaSyntaxes$Rec;)I + 53: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Rec;)I" + 54: Utf8StringConstant "equals" + 55: Utf8StringConstant "(Ljava/lang/Object;)Z" + 56: InvokeDynamicInfo 0, #54.#58 // equals:(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z + 57: NameAndTypeDescriptor #54.#58 // equals:(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z + 58: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z" + 59: Utf8StringConstant "SourceFile" + 60: Utf8StringConstant "AllJavaSyntaxes.java" + 61: Utf8StringConstant "BootstrapMethods" + 62: MethodReference #63.#65 // java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + 63: TypeInfo #64 // java/lang/runtime/ObjectMethods + 64: Utf8StringConstant "java/lang/runtime/ObjectMethods" + 65: NameAndTypeDescriptor #66.#67 // bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + 66: Utf8StringConstant "bootstrap" + 67: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;" + 68: MethodHandle InvokeStatic #63.#65 // java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + 69: StringConstant #70 // "s;l" + 70: Utf8StringConstant "s;l" + 71: MethodHandle GetField #1.#31 // demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 72: MethodHandle GetField #1.#33 // demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 73: Utf8StringConstant "InnerClasses" + 74: TypeInfo #75 // demo/AllJavaSyntaxes + 75: Utf8StringConstant "demo/AllJavaSyntaxes" + 76: Utf8StringConstant "Rec" + 77: TypeInfo #78 // java/lang/invoke/MethodHandles$Lookup + 78: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 79: TypeInfo #80 // java/lang/invoke/MethodHandles + 80: Utf8StringConstant "java/lang/invoke/MethodHandles" + 81: Utf8StringConstant "Lookup" + 82: Utf8StringConstant "NestHost" + 83: Utf8StringConstant "Record" + private final java.lang.String s; + Flags: PRIVATE, FINAL + private final java.util.List l; + Flags: PRIVATE, FINAL + Signature: Ljava/util/List; + public void (java.lang.String s, java.util.List l); + Flags: PUBLIC + Code: + stack=2, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Record.:()V + 4: aload_1 /* s */ + 5: ifnonnull 13 + 8: ldc "" + 10: goto 14 + 13: aload_1 /* s */ + 14: astore_1 /* s */ + 15: aload_2 /* l */ + 16: ifnonnull 25 + 19: invokestatic java/util/List.of:()Ljava/util/List; + 22: goto 29 + 25: aload_2 /* l */ + 26: invokestatic java/util/List.copyOf:(Ljava/util/Collection;)Ljava/util/List; + 29: astore_2 /* l */ + 30: aload_0 /* this */ + 31: aload_1 /* s */ + 32: putfield demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 35: aload_0 /* this */ + 36: aload_2 /* l */ + 37: putfield demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 40: return + Signature: + (Ljava/lang/String;Ljava/util/List;)V + MethodParameters: + Name Flags + ---- -------- + s MANDATED + l MANDATED + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------- + 0 41 0 this Ldemo/AllJavaSyntaxes$Rec; + 0 41 1 s Ljava/lang/String; + 0 41 2 l Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 41 2 l Ljava/util/List; + StackMapTable: 00 04 FF 00 0D 00 03 07 00 01 07 00 28 07 00 15 00 00 40 07 00 28 0A 43 07 00 15 + public java.lang.String s(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public java.util.List l(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 4: areturn + Signature: + ()Ljava/util/List; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public final java.lang.String toString(); + Flags: PUBLIC, FINAL + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 + 1: invokedynamic BootstrapMethod #0, toString:(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String; + 6: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public final int hashCode(); + Flags: PUBLIC, FINAL + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 + 1: invokedynamic BootstrapMethod #0, hashCode:(Ldemo/AllJavaSyntaxes$Rec;)I + 6: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public final boolean equals(java.lang.Object p0); + Flags: PUBLIC, FINAL + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 + 1: aload_1 + 2: invokedynamic BootstrapMethod #0, equals:(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z + 7: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.StrictClass + Minor version: 0 + Major version: 69 + Flags: STATIC, STRICTFP, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static strictfp StrictClass = demo/AllJavaSyntaxes$StrictClass of demo/AllJavaSyntaxes + NestHost: 00 15 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$StrictClass + 2: Utf8StringConstant "demo/AllJavaSyntaxes$StrictClass" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$StrictClass;" + 14: Utf8StringConstant "value" + 15: Utf8StringConstant "()D" + 16: DoubleConstant 0.3333333333333333 + 18: Utf8StringConstant "SourceFile" + 19: Utf8StringConstant "AllJavaSyntaxes.java" + 20: Utf8StringConstant "InnerClasses" + 21: TypeInfo #22 // demo/AllJavaSyntaxes + 22: Utf8StringConstant "demo/AllJavaSyntaxes" + 23: Utf8StringConstant "StrictClass" + 24: Utf8StringConstant "NestHost" + void (); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$StrictClass; + double value(); + Code: + stack=2, locals=1, arguments=0 + 0: ldc2_w 0.3333333333333333 + 3: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes$StrictClass; +class demo.AllJavaSyntaxes.SuperInner + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$SuperOuter; + InnerClasses: + SuperInner = demo/AllJavaSyntaxes$SuperInner of demo/AllJavaSyntaxes + Deep = demo/AllJavaSyntaxes$SuperInner$Deep of demo/AllJavaSyntaxes$SuperInner + SuperOuter = demo/AllJavaSyntaxes$SuperOuter of demo/AllJavaSyntaxes + NestHost: 00 1D + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$SuperInner + 2: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$SuperOuter + 4: Utf8StringConstant "demo/AllJavaSyntaxes$SuperOuter" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$SuperInner.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // demo/AllJavaSyntaxes$SuperOuter.:(Ldemo/AllJavaSyntaxes;)V + 13: NameAndTypeDescriptor #7.#8 // :(Ldemo/AllJavaSyntaxes;)V + 14: Utf8StringConstant "LineNumberTable" + 15: Utf8StringConstant "LocalVariableTable" + 16: Utf8StringConstant "this" + 17: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperInner;" + 18: Utf8StringConstant "access$0" + 19: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String;" + 20: MethodReference #3.#21 // demo/AllJavaSyntaxes$SuperOuter.value:()Ljava/lang/String; + 21: NameAndTypeDescriptor #22.#23 // value:()Ljava/lang/String; + 22: Utf8StringConstant "value" + 23: Utf8StringConstant "()Ljava/lang/String;" + 24: Utf8StringConstant "SourceFile" + 25: Utf8StringConstant "AllJavaSyntaxes.java" + 26: Utf8StringConstant "Signature" + 27: Utf8StringConstant "Ldemo/AllJavaSyntaxes.SuperOuter;" + 28: Utf8StringConstant "InnerClasses" + 29: TypeInfo #30 // demo/AllJavaSyntaxes + 30: Utf8StringConstant "demo/AllJavaSyntaxes" + 31: Utf8StringConstant "SuperInner" + 32: TypeInfo #33 // demo/AllJavaSyntaxes$SuperInner$Deep + 33: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner$Deep" + 34: Utf8StringConstant "Deep" + 35: Utf8StringConstant "SuperOuter" + 36: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$SuperInner.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: aload_1 + 7: invokespecial demo/AllJavaSyntaxes$SuperOuter.:(Ldemo/AllJavaSyntaxes;)V + 10: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes$SuperInner; + static java.lang.String access$0(demo.AllJavaSyntaxes.SuperInner p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: invokespecial demo/AllJavaSyntaxes$SuperOuter.value:()Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.SuperInner.Deep + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + SuperInner = demo/AllJavaSyntaxes$SuperInner of demo/AllJavaSyntaxes + Deep = demo/AllJavaSyntaxes$SuperInner$Deep of demo/AllJavaSyntaxes$SuperInner + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$SuperInner$Deep + 2: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner$Deep" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$1" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperInner;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$SuperInner;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$SuperInner$Deep.this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 11: NameAndTypeDescriptor #5.#6 // this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperInner$Deep;" + 19: Utf8StringConstant "value" + 20: Utf8StringConstant "()Ljava/lang/String;" + 21: MethodReference #22.#24 // demo/AllJavaSyntaxes$SuperInner.access$0:(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String; + 22: TypeInfo #23 // demo/AllJavaSyntaxes$SuperInner + 23: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner" + 24: NameAndTypeDescriptor #25.#26 // access$0:(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String; + 25: Utf8StringConstant "access$0" + 26: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String;" + 27: Utf8StringConstant "SourceFile" + 28: Utf8StringConstant "AllJavaSyntaxes.java" + 29: Utf8StringConstant "InnerClasses" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "SuperInner" + 33: Utf8StringConstant "Deep" + 34: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes.SuperInner this$1; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.SuperInner p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$SuperInner$Deep.this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$SuperInner$Deep; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$SuperInner$Deep.this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 4: invokestatic demo/AllJavaSyntaxes$SuperInner.access$0:(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String; + 7: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes$SuperInner$Deep; +class demo.AllJavaSyntaxes.SuperOuter + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + SuperOuter = demo/AllJavaSyntaxes$SuperOuter of demo/AllJavaSyntaxes + NestHost: 00 1A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$SuperOuter + 2: Utf8StringConstant "demo/AllJavaSyntaxes$SuperOuter" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$SuperOuter.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperOuter;" + 19: Utf8StringConstant "value" + 20: Utf8StringConstant "()Ljava/lang/String;" + 21: StringConstant #22 // "outer" + 22: Utf8StringConstant "outer" + 23: Utf8StringConstant "SourceFile" + 24: Utf8StringConstant "AllJavaSyntaxes.java" + 25: Utf8StringConstant "InnerClasses" + 26: TypeInfo #27 // demo/AllJavaSyntaxes + 27: Utf8StringConstant "demo/AllJavaSyntaxes" + 28: Utf8StringConstant "SuperOuter" + 29: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$SuperOuter.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$SuperOuter; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: ldc "outer" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$SuperOuter; +@interface demo.AllJavaSyntaxes.Tag + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + NestHost: 00 0F + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Tag + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "value" + 8: Utf8StringConstant "()Ljava/lang/String;" + 9: Utf8StringConstant "SourceFile" + 10: Utf8StringConstant "AllJavaSyntaxes.java" + 11: Utf8StringConstant "RuntimeVisibleAnnotations" + 12: Utf8StringConstant "Ljava/lang/annotation/Repeatable;" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tags;" + 14: Utf8StringConstant "InnerClasses" + 15: TypeInfo #16 // demo/AllJavaSyntaxes + 16: Utf8StringConstant "demo/AllJavaSyntaxes" + 17: Utf8StringConstant "Tag" + 18: Utf8StringConstant "NestHost" + public abstract java.lang.String value(); + Flags: PUBLIC, ABSTRACT +class demo.AllJavaSyntaxes.Tagged + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + Tagged = demo/AllJavaSyntaxes$Tagged of demo/AllJavaSyntaxes + abstract static interface Tags = demo/AllJavaSyntaxes$Tags of demo/AllJavaSyntaxes + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Tagged + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Tagged" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Tagged.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tagged;" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "RuntimeInvisibleAnnotations" + 22: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tags;" + 23: Utf8StringConstant "value" + 24: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tag;" + 25: Utf8StringConstant "one" + 26: Utf8StringConstant "two" + 27: Utf8StringConstant "InnerClasses" + 28: TypeInfo #29 // demo/AllJavaSyntaxes$Tag + 29: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "Tag" + 33: Utf8StringConstant "Tagged" + 34: TypeInfo #35 // demo/AllJavaSyntaxes$Tags + 35: Utf8StringConstant "demo/AllJavaSyntaxes$Tags" + 36: Utf8StringConstant "Tags" + 37: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Tagged.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Tagged; +@interface demo.AllJavaSyntaxes.Tags + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + abstract static interface Tags = demo/AllJavaSyntaxes$Tags of demo/AllJavaSyntaxes + NestHost: 00 0E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Tags + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Tags" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "value" + 8: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Tag;" + 9: Utf8StringConstant "SourceFile" + 10: Utf8StringConstant "AllJavaSyntaxes.java" + 11: Utf8StringConstant "InnerClasses" + 12: TypeInfo #13 // demo/AllJavaSyntaxes$Tag + 13: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 14: TypeInfo #15 // demo/AllJavaSyntaxes + 15: Utf8StringConstant "demo/AllJavaSyntaxes" + 16: Utf8StringConstant "Tag" + 17: Utf8StringConstant "Tags" + 18: Utf8StringConstant "NestHost" + public abstract demo.AllJavaSyntaxes.Tag[] value(); + Flags: PUBLIC, ABSTRACT +@interface demo.AllJavaSyntaxes.TypeUse + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface TypeUse = demo/AllJavaSyntaxes$TypeUse of demo/AllJavaSyntaxes + NestHost: 00 0F + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$TypeUse + 2: Utf8StringConstant "demo/AllJavaSyntaxes$TypeUse" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "RuntimeVisibleAnnotations" + 10: Utf8StringConstant "Ljava/lang/annotation/Target;" + 11: Utf8StringConstant "value" + 12: Utf8StringConstant "Ljava/lang/annotation/ElementType;" + 13: Utf8StringConstant "TYPE_USE" + 14: Utf8StringConstant "InnerClasses" + 15: TypeInfo #16 // demo/AllJavaSyntaxes + 16: Utf8StringConstant "demo/AllJavaSyntaxes" + 17: Utf8StringConstant "TypeUse" + 18: Utf8StringConstant "NestHost" +@interface demo.AllJavaSyntaxes.WithDefaults + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface WithDefaults = demo/AllJavaSyntaxes$WithDefaults of demo/AllJavaSyntaxes + NestHost: 00 16 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$WithDefaults + 2: Utf8StringConstant "demo/AllJavaSyntaxes$WithDefaults" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "number" + 8: Utf8StringConstant "()I" + 9: Utf8StringConstant "AnnotationDefault" + 10: IntegerConstant 42 + 11: Utf8StringConstant "text" + 12: Utf8StringConstant "()Ljava/lang/String;" + 13: Utf8StringConstant "default" + 14: Utf8StringConstant "type" + 15: Utf8StringConstant "()Ljava/lang/Class;" + 16: Utf8StringConstant "Signature" + 17: Utf8StringConstant "()Ljava/lang/Class<*>;" + 18: Utf8StringConstant "Ljava/lang/Object;" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "InnerClasses" + 22: TypeInfo #23 // demo/AllJavaSyntaxes + 23: Utf8StringConstant "demo/AllJavaSyntaxes" + 24: Utf8StringConstant "WithDefaults" + 25: Utf8StringConstant "NestHost" + public abstract int number(); + Flags: PUBLIC, ABSTRACT + public abstract java.lang.String text(); + Flags: PUBLIC, ABSTRACT + public abstract java.lang.Class type(); + Flags: PUBLIC, ABSTRACT + Signature: + ()Ljava/lang/Class<*>; +class demo.AllJavaSyntaxes.Local + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes + EnclosingMethod: demo/AllJavaSyntaxes.localClass:()V + InnerClasses: + Local = demo/AllJavaSyntaxes$1Local + NestHost: 00 1A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$1Local + 2: Utf8StringConstant "demo/AllJavaSyntaxes$1Local" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$1Local.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$1Local;" + 19: Utf8StringConstant "value" + 20: Utf8StringConstant "()Ljava/lang/String;" + 21: StringConstant #22 // "local" + 22: Utf8StringConstant "local" + 23: Utf8StringConstant "SourceFile" + 24: Utf8StringConstant "AllJavaSyntaxes.java" + 25: Utf8StringConstant "EnclosingMethod" + 26: TypeInfo #27 // demo/AllJavaSyntaxes + 27: Utf8StringConstant "demo/AllJavaSyntaxes" + 28: NameAndTypeDescriptor #29.#14 // localClass:()V + 29: Utf8StringConstant "localClass" + 30: Utf8StringConstant "InnerClasses" + 31: Utf8StringConstant "Local" + 32: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$1Local.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$1Local; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: ldc "local" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$1Local; +class demo.AllJavaSyntaxes$2demo.AllJavaSyntaxes.AllJavaSyntaxes$2 + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Object;Ljava/util/Comparator; + EnclosingType: demo/AllJavaSyntaxes + EnclosingMethod: demo/AllJavaSyntaxes.diamondAnonymous:()V + InnerClasses: + demo/AllJavaSyntaxes$2 + NestHost: 00 28 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$2 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$2" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/util/Comparator + 6: Utf8StringConstant "java/util/Comparator" + 7: Utf8StringConstant "this$0" + 8: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 11: Utf8StringConstant "Code" + 12: FieldReference #1.#13 // demo/AllJavaSyntaxes$2.this$0:Ldemo/AllJavaSyntaxes; + 13: NameAndTypeDescriptor #7.#8 // this$0:Ldemo/AllJavaSyntaxes; + 14: MethodReference #3.#15 // java/lang/Object.:()V + 15: NameAndTypeDescriptor #9.#16 // :()V + 16: Utf8StringConstant "()V" + 17: Utf8StringConstant "LineNumberTable" + 18: Utf8StringConstant "LocalVariableTable" + 19: Utf8StringConstant "this" + 20: Utf8StringConstant "Ldemo/AllJavaSyntaxes$2;" + 21: Utf8StringConstant "compare" + 22: Utf8StringConstant "(Ljava/lang/String;Ljava/lang/String;)I" + 23: MethodReference #24.#26 // java/lang/String.compareTo:(Ljava/lang/String;)I + 24: TypeInfo #25 // java/lang/String + 25: Utf8StringConstant "java/lang/String" + 26: NameAndTypeDescriptor #27.#28 // compareTo:(Ljava/lang/String;)I + 27: Utf8StringConstant "compareTo" + 28: Utf8StringConstant "(Ljava/lang/String;)I" + 29: Utf8StringConstant "a" + 30: Utf8StringConstant "Ljava/lang/String;" + 31: Utf8StringConstant "b" + 32: Utf8StringConstant "(Ljava/lang/Object;Ljava/lang/Object;)I" + 33: MethodReference #1.#34 // demo/AllJavaSyntaxes$2.compare:(Ljava/lang/String;Ljava/lang/String;)I + 34: NameAndTypeDescriptor #21.#22 // compare:(Ljava/lang/String;Ljava/lang/String;)I + 35: Utf8StringConstant "SourceFile" + 36: Utf8StringConstant "AllJavaSyntaxes.java" + 37: Utf8StringConstant "Signature" + 38: Utf8StringConstant "Ljava/lang/Object;Ljava/util/Comparator;" + 39: Utf8StringConstant "EnclosingMethod" + 40: TypeInfo #41 // demo/AllJavaSyntaxes + 41: Utf8StringConstant "demo/AllJavaSyntaxes" + 42: NameAndTypeDescriptor #43.#16 // diamondAnonymous:()V + 43: Utf8StringConstant "diamondAnonymous" + 44: Utf8StringConstant "InnerClasses" + 45: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$2.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$2; + public int compare(java.lang.String a, java.lang.String b); + Flags: PUBLIC + Code: + stack=2, locals=3, arguments=2 + 0: aload_1 /* a */ + 1: aload_2 /* b */ + 2: invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + 5: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------ + 0 6 0 this Ldemo/AllJavaSyntaxes$2; + 0 6 1 a Ljava/lang/String; + 0 6 2 b Ljava/lang/String; + public int compare(java.lang.Object p0, java.lang.Object p1); + Flags: PUBLIC, BRIDGE, SYNTHETIC + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 + 1: aload_1 + 2: checkcast Ljava/lang/String; + 5: aload_2 + 6: checkcast Ljava/lang/String; + 9: invokevirtual demo/AllJavaSyntaxes$2.compare:(Ljava/lang/String;Ljava/lang/String;)I + 12: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes$1demo.AllJavaSyntaxes.AllJavaSyntaxes$1 + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$Outer$Inner; + EnclosingType: demo/AllJavaSyntaxes + EnclosingMethod: demo/AllJavaSyntaxes.qualifiedNew:(Ldemo/AllJavaSyntaxes$Outer;)V + InnerClasses: + demo/AllJavaSyntaxes$1 + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + NestHost: 00 18 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$1 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$1" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Outer$Inner + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$1.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 13: NameAndTypeDescriptor #7.#14 // :(Ldemo/AllJavaSyntaxes$Outer;)V + 14: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$1;" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "Signature" + 22: Utf8StringConstant "Ldemo/AllJavaSyntaxes.Outer.Inner;" + 23: Utf8StringConstant "EnclosingMethod" + 24: TypeInfo #25 // demo/AllJavaSyntaxes + 25: Utf8StringConstant "demo/AllJavaSyntaxes" + 26: NameAndTypeDescriptor #27.#14 // qualifiedNew:(Ldemo/AllJavaSyntaxes$Outer;)V + 27: Utf8StringConstant "qualifiedNew" + 28: Utf8StringConstant "InnerClasses" + 29: TypeInfo #30 // demo/AllJavaSyntaxes$Outer + 30: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 31: Utf8StringConstant "Outer" + 32: Utf8StringConstant "Inner" + 33: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0, demo.AllJavaSyntaxes.Outer p1); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=2, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$1.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: aload_2 + 7: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 10: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------ + 0 11 0 this Ldemo/AllJavaSyntaxes$1; diff --git a/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes.txt b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes.txt new file mode 100644 index 00000000..327170af --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes.txt @@ -0,0 +1,799 @@ +package demo; +import java.lang.invoke.CallSite; +import java.lang.reflect.UndeclaredThrowableException; +import java.lang.invoke.MethodHandle; +import java.lang.runtime.SwitchBootstraps; +import java.lang.invoke.MethodType; +import java.lang.invoke.MethodHandles; +import java.lang.annotation.Repeatable; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Retention; +import java.util.Collection; +import java.util.Iterator; +import java.util.Objects; +import java.util.Comparator; +import java.math.BigDecimal; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.function.Supplier; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Consumer; +import java.util.stream.Stream; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicInteger; +import java.io.Serializable; +import java.util.ArrayList; +public abstract class AllJavaSyntaxes> extends ArrayList implements Serializable, Comparable, Iterable +{ + private static final long serialVersionUID = 1L; + private static final AtomicInteger COUNTER; + public abstract void log(final String p0); + @Tags({ @Tag("one"), @Tag("two") }) + class Tagged + { + } + sealed interface Shape permits Circle, Rectangle + { + double area(); + } + interface Named + { + String name(); + } + interface Identified + { + long id(); + } + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.TYPE, ElementType.METHOD }) + @interface Marker { + } + @Repeatable(Tags.class) + @interface Tag { + String value(); + } + @interface Tags { + Tag[] value(); + } + @Target({ ElementType.TYPE_USE }) + @interface TypeUse { + } + @interface WithDefaults { + int number() default 42; + String text() default "default"; + Class type() default Object.class; + } + // This helper class was generated by Procyon to approximate the behavior of an + // 'invokedynamic' instruction that it doesn't know how to interpret. + private static final class ProcyonInvokeDynamicHelper_1 + { + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static MethodHandle handle; + private static volatile int fence; + private static MethodHandle handle() { + final MethodHandle handle = ProcyonInvokeDynamicHelper_1.handle; + if (handle != null) + return handle; + return ProcyonInvokeDynamicHelper_1.ensureHandle(); + } + private static MethodHandle ensureHandle() { + ProcyonInvokeDynamicHelper_1.fence = 0; + MethodHandle handle = ProcyonInvokeDynamicHelper_1.handle; + if (handle == null) { + MethodHandles.Lookup lookup = ProcyonInvokeDynamicHelper_1.LOOKUP; + try { + handle = ((CallSite)SwitchBootstraps.typeSwitch(lookup, "typeSwitch", MethodType.methodType(int.class, Object.class, int.class), String.class)).dynamicInvoker(); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + ProcyonInvokeDynamicHelper_1.fence = 1; + ProcyonInvokeDynamicHelper_1.handle = handle; + ProcyonInvokeDynamicHelper_1.fence = 0; + } + return handle; + } + private static int invoke(Object p0, int p1) { + try { + return ProcyonInvokeDynamicHelper_1.handle().invokeExact(p0, p1); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + } + } + // This helper class was generated by Procyon to approximate the behavior of an + // 'invokedynamic' instruction that it doesn't know how to interpret. + private static final class ProcyonInvokeDynamicHelper_2 + { + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static MethodHandle handle; + private static volatile int fence; + private static MethodHandle handle() { + final MethodHandle handle = ProcyonInvokeDynamicHelper_2.handle; + if (handle != null) + return handle; + return ProcyonInvokeDynamicHelper_2.ensureHandle(); + } + private static MethodHandle ensureHandle() { + ProcyonInvokeDynamicHelper_2.fence = 0; + MethodHandle handle = ProcyonInvokeDynamicHelper_2.handle; + if (handle == null) { + MethodHandles.Lookup lookup = ProcyonInvokeDynamicHelper_2.LOOKUP; + try { + handle = ((CallSite)SwitchBootstraps.typeSwitch(lookup, "typeSwitch", MethodType.methodType(int.class, Object.class, int.class), Circle.class, Rectangle.class)).dynamicInvoker(); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + ProcyonInvokeDynamicHelper_2.fence = 1; + ProcyonInvokeDynamicHelper_2.handle = handle; + ProcyonInvokeDynamicHelper_2.fence = 0; + } + return handle; + } + private static int invoke(Object p0, int p1) { + try { + return ProcyonInvokeDynamicHelper_2.handle().invokeExact(p0, p1); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + } + } + // This helper class was generated by Procyon to approximate the behavior of an + // 'invokedynamic' instruction that it doesn't know how to interpret. + private static final class ProcyonInvokeDynamicHelper_3 + { + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static MethodHandle handle; + private static volatile int fence; + private static MethodHandle handle() { + final MethodHandle handle = ProcyonInvokeDynamicHelper_3.handle; + if (handle != null) + return handle; + return ProcyonInvokeDynamicHelper_3.ensureHandle(); + } + private static MethodHandle ensureHandle() { + ProcyonInvokeDynamicHelper_3.fence = 0; + MethodHandle handle = ProcyonInvokeDynamicHelper_3.handle; + if (handle == null) { + MethodHandles.Lookup lookup = ProcyonInvokeDynamicHelper_3.LOOKUP; + try { + handle = ((CallSite)SwitchBootstraps.typeSwitch(lookup, "typeSwitch", MethodType.methodType(int.class, Object.class, int.class), Success.class, Failure.class)).dynamicInvoker(); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + ProcyonInvokeDynamicHelper_3.fence = 1; + ProcyonInvokeDynamicHelper_3.handle = handle; + ProcyonInvokeDynamicHelper_3.fence = 0; + } + return handle; + } + private static int invoke(Object p0, int p1) { + try { + return ProcyonInvokeDynamicHelper_3.handle().invokeExact(p0, p1); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + } + } + public AllJavaSyntaxes() { + } + private static transient volatile char[] CHARS = { 'A', 'B' }; + static { + COUNTER = new AtomicInteger(); + final int x = 1; + final int y = 2; + init(); + } + @Deprecated(forRemoval = true, since = "11") + void deprecatedMethod() { + } + private static void init() { + AllJavaSyntaxes.COUNTER.incrementAndGet(); + } + @SafeVarargs + protected final Object[] methodReferencesAndLambdas(final T... arguments) { + Stream.of(arguments).forEach(System.out::println); + return Stream.of(arguments).map((Function)Object::toString).toArray(Object[]::new); + } + void classicFor(final String[] arguments) { + for (int index = 0; index < arguments.length; ++index) { + this.log(arguments[index]); + } + for (int index = 0; index < arguments.length; ++index) { + this.log(arguments[index]); + } + } + void whileLoop(final String[] arguments) { + int index = 0; + while (index < arguments.length) { + this.log(arguments[index++]); + } + index = 0; + while (index < arguments.length) { + this.log(arguments[index++]); + } + } + void doWhileLoop(final String[] arguments) { + int index = 0; + do { + this.log(arguments[index++]); + } while (index < arguments.length); + index = 0; + do { + this.log(arguments[index++]); + } while (index < arguments.length); + } + void lambdaAndOptional() { + final Supplier supplier = () -> "value"; + final Function function = String::length; + Optional.ofNullable(supplier.get()).map((Function)function).ifPresent(length -> this.log("length=" + String.valueOf(length))); + } + void typedLambdaParams(final List list) { + list.sort((a, b) -> b.compareTo(a)); + } + void unTypedLambdaParams(final List list) { + list.sort((a, b) -> b.compareTo(a)); + } + synchronized void synchronizedMethod() { + this.log("synchronized"); + } + void tryCatchFinally() { + try { + if (AllJavaSyntaxes.COUNTER.get() < 0) { + throw new IllegalStateException(); + } + } catch (final RuntimeException exception) { + this.log(exception.getClass().getSimpleName()); + return; + } finally { + this.log("finally"); + } + this.log("finally"); + } + void tryWithResources(final Path path) { + try { + Throwable t = null; + try { + final BufferedReader br = Files.newBufferedReader(path); + try { + String line; + while ((line = br.readLine()) != null) { + this.log(line); + } + } finally { + if (br != null) { + br.close(); + } + } + } finally { + if (t == null) { + final Throwable t2; + t = t2; + } else { + final Throwable t2; + if (t != t2) { + t.addSuppressed(t2); + } + } + } + } catch (final IOException exception) { + this.log(exception.getMessage()); + } + } + void assertions(final int value) { + assert value >= 0 : "negative"; + } + void boxingAndNumbers() { + final Integer boxed = 1; + final int primitive = boxed; + final BigDecimal decimal = BigDecimal.valueOf(primitive); + this.log(decimal.toPlainString()); + } + void instanceofPattern(final Object object) { + if (object instanceof final String text) { + if (!text.isEmpty()) { + this.log(text); + } + } + } + void enumSwitch(final Day day) { + switch (day) { + case MONDAY: + case TUESDAY: { + this.log("weekday"); + break; + } + default: { + this.log("other"); + break; + } + } + } + public String expressionSwitch(final int value) { + return switch (value) { + case 0 -> "zero"; + case 1 -> "one"; + default -> throw new IllegalArgumentException(); + }; + } + @Override + public int compareTo(final E other) { + return Comparator.naturalOrder().compare(null, other); + } + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), AllJavaSyntaxes.COUNTER.get()); + } + @Override + public boolean equals(final Object object) { + return this == object || (super.equals(object) && this.getClass() == object.getClass()); + } + static class Entity implements Named, Identified, Comparable + { + private long id; + private String name; + Entity(final long id, final String name) { + this.id = id; + this.name = name; + } + @Override + public String name() { + return this.name; + } + @Override + public long id() { + return this.id; + } + @Override + public int hashCode() { + return Objects.hash(this.id, this.name); + } + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (this.getClass() != obj.getClass()) { + return false; + } + final Entity other = (Entity)obj; + return this.id == other.id && Objects.equals(this.name, other.name); + } + @Override + public int compareTo(final Entity other) { + return Long.compare(this.id, other.id); + } + } + static > T intersectionBound(final T value) { + return value; + } + void intersectionCast(final Object object) { + this.log(((Named)object).name()); + } + static final class Circle implements Shape + { + private final double radius; + Circle(final double radius) { + this.radius = radius; + } + @Override + public double area() { + return 3.141592653589793 * this.radius * this.radius; + } + } + static final class Rectangle implements Shape + { + private final double width; + private final double height; + Rectangle(final double width, final double height) { + this.width = width; + this.height = height; + } + @Override + public double area() { + return this.width * this.height; + } + } + void guardedPattern(final Object object) { + Objects.requireNonNull(object); + Object o = object; + boolean b = false; + Label_0061: + while (true) { + switch (/* invokedynamic(!) */ProcyonInvokeDynamicHelper_1.invoke(o, b)) { + case 0: { + final String s = (String)object; + if (s.length() > 3) { + this.log(s); + break Label_0061; + } + o = object; + b = true; + continue; + } + default: { + break Label_0061; + } + } + } + } + double sealedSwitch(final Shape shape) { + Objects.requireNonNull(shape); + return switch (/* invokedynamic(!) */ProcyonInvokeDynamicHelper_2.invoke(shape, false)) { + case 0 -> { + final Circle circle = (Circle)shape; + yield circle.area(); + } + case 1 -> { + final Rectangle rectangle = (Rectangle)shape; + yield rectangle.area(); + } + default -> throw new MatchException((String)null, (Throwable)null); + }; + } + abstract static sealed class Result permits Success, Failure + { + private Result() { + } + } + static final class Success extends Result + { + private final T value; + Success(final T value) { + this.value = value; + } + T value() { + return this.value; + } + } + static final class Failure extends Result + { + private final Exception exception; + Failure(final Exception exception) { + this.exception = exception; + } + Exception exception() { + return this.exception; + } + } + String handleResult(final Result result) { + Objects.requireNonNull(result); + return switch (/* invokedynamic(!) */ProcyonInvokeDynamicHelper_3.invoke(result, false)) { + case 0 -> { + final Success success = (Success)result; + yield "success:" + String.valueOf(success.value()); + } + case 1 -> { + final Failure failure = (Failure)result; + yield "failure:" + failure.exception().getClass().getSimpleName(); + } + default -> throw new MatchException((String)null, (Throwable)null); + }; + } + class Inner + { + Inner() { + AllJavaSyntaxes.this.log("Inner constructor"); + } + void anonymousClass() { + new Thread(new Runnable() { + private static final long CONSTANT = 1L; + int index = -1; + @Override + public void run() { + AllJavaSyntaxes.this.log("index=" + this.index + ",constant=1"); + } + }).start(); + } + void lambda() { + new Thread(() -> AllJavaSyntaxes.this.log("Inner.lambda")).start(); + } + } + record Rec(String s, List l) { + public Rec { + s = ((s == null) ? "" : s); + l = ((l == null) ? List.of() : List.copyOf((Collection)l)); + } + } + enum Day + { + MONDAY("MONDAY", 0), + TUESDAY("TUESDAY", 1), + WEDNESDAY("WEDNESDAY", 2), + THURSDAY("THURSDAY", 3), + FRIDAY("FRIDAY", 4), + SATURDAY("SATURDAY", 5), + SUNDAY("SUNDAY", 6); + private Day(final String s, final int n) { + } + } + static T genericMethod(final T value) { + return value; + } + transient Callable callable = () -> "callable"; + void labeledLoops() { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + if (i == j) { + break; + } + if (i + j > 3) { + break; + } + } + } + } + void labeledBlock() { + if (AllJavaSyntaxes.COUNTER.get() < 0) { + this.log("unreachable"); + } + } + void localVar() { + final int number = 123; + final String text = "text"; + final ArrayList list = new ArrayList(); + this.log(text + number + list.size()); + } + void multiCatch() throws Exception { + try { + throw new IOException(); + } catch (final IOException | RuntimeException exception) { + throw exception; + } + } + void suppressed() throws Exception { + final Exception primary = new Exception("primary"); + final Exception secondary = new Exception("secondary"); + primary.addSuppressed(secondary); + throw primary; + } + String throwExpression(final Integer value) { + return Optional.ofNullable(value).map((Function)Object::toString).orElseThrow(() -> new IllegalArgumentException()); + } + void synchronizedBlock() { + synchronized (this) { + this.log("sync"); + } + } + void localClass() { + class Local + { + String value() { + return "local"; + } + } + this.log(new Local().value()); + } + static class GenericConstructor + { + GenericConstructor(final T value) { + } + } + void intersectionThrows() throws T, Exception { + } + void wildcard(final List list) { + this.capture(list); + } + private void capture(final List list) { + for (final T element : list) { + this.log(String.valueOf(element)); + } + } + interface AdvancedInterface + { + default String defaultMethod() { + return this.privateHelper(); + } + default String staticMethod() { + return "static"; + } + default String privateHelper() { + return "private"; + } + } + void typeUse() { + final String value = "x"; + final List list = List.of((Object)value); + this.log(list.get(0)); + } + void arrays() { + final int[] array = new int[0]; + final int[] array2 = { 1, 2, 3 }; + final String[][] array3 = { { "a" }, { "b" } }; + final int[] array4 = { 0 }; + (new int[2])[1] = 1; + final int[][] array5 = { { 1, 2, 3 }, { 4, 5, 6 } }; + } + void literals() { + final int bin = 10; + final int hex = 255; + final long underscore = 1000000L; + final float f = 1.0f; + final double d = 1000.0; + final char ch = 'A'; + this.log("" + bin + hex + underscore + f + d + ch); + } + void textBlock() { + final String text = """ + line1 + line2 + """; + this.log(text); + } + int switchYield(final int i) { + return switch (i) { + case 0 -> 10; + default -> -1; + }; + } + abstract static class Base + { + String value() { + return "base"; + } + } + class Derived extends Base + { + Derived(final AllJavaSyntaxes allJavaSyntaxes) { + this(allJavaSyntaxes, "x"); + } + Derived(final String s) { + } + @Override + String value() { + return super.value(); + } + void qualifiedThis() { + AllJavaSyntaxes.this.log("qualified"); + } + } + enum Operation permits AllJavaSyntaxes$Operation$1, AllJavaSyntaxes$Operation$2 + { + ADD { + @Override + int apply(final int a, final int b) { + return a + b; + } + }, + SUB { + @Override + int apply(final int a, final int b) { + return a - b; + } + }; + private Operation(final String s, final int n) { + } + native int apply(final int p0, final int p1); + } + void allOperators() { + int a = 10; + final int b = 3; + final int n = a / b; + final int n2 = a % b; + ++a; + --a; + ++a; + if (--a > b) {} + final boolean b2 = "x" instanceof String; + final long widened = a; + new Object(); + final int[] array = new int[3]; + final int element = array[0]; + this.log(String.valueOf(element)); + final int length = array.length; + String::length; + () -> 42; + this.log("this"); + super.size(); + String::compareTo; + final int[][] matrix = new int[1][1]; + final int length2 = matrix[0].length; + () -> this.log("run"); + ArrayList::new; + final int yielded = switch (a) { + case 0 -> 0; + default -> 1; + }; + assert yielded >= 0; + final RuntimeException exception = new RuntimeException(); + if (exception == null) {} + for (int i = 0, j = 10; i < j; ++i, --j) { + this.log(i + ":" + j); + } + } + class Outer + { + int value = 1; + final /* synthetic */ AllJavaSyntaxes this$0; + Outer() { + } + class Inner + { + final /* synthetic */ Outer this$1; + Inner() { + Outer.this.this$0.log("Inner"); + } + class Deep + { + Deep() { + Inner.this.this$1.this$0.log("Deep"); + } + } + } + static class StaticNested + { + StaticNested() { + System.out.println("StaticNested"); + } + } + } + void qualifiedNew(final Outer outer) { + final Outer.Inner inner = outer.new Inner(); + outer.new Inner().new Deep(); + final Outer.Inner inner2 = outer.new Inner(); + new Outer().new Inner(); + outer.getClass(); + final Outer.Inner inner3 = new Outer.Inner(outer) {}; + new Outer.StaticNested(); + new Outer.StaticNested(); + } + void receiverParameter() { + this.log("receiver"); + } + void diamondAnonymous() { + final Comparator c = new Comparator() { + @Override + public int compare(final String a, final String b) { + return a.compareTo(b); + } + }; + this.log(String.valueOf(c.compare("a", "b"))); + } + void emptyStatement(final boolean flag) { + while (flag) {} + } + class SuperOuter + { + String value() { + return "outer"; + } + } + class SuperInner extends SuperOuter + { + class Deep + { + String value() { + return SuperOuter.this.value(); + } + } + } + void multiDimVarargs(final int[]... values) { + this.log(String.valueOf(values.length)); + } + double strict(final double a, final double b) { + return a / b; + } + static strictfp class StrictClass + { + double value() { + return 0.3333333333333333; + } + } + void chainedAssignment() { + final int c; + final int a; + final int b = a = (c = 10); + this.log(String.valueOf(a + b + c)); + } + void parameterAnnotation(@Deprecated final String value) { + this.log(value); + } +} diff --git a/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/module-info.txt b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/module-info.txt new file mode 100644 index 00000000..39525c4c --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/module-info.txt @@ -0,0 +1,16 @@ +module com.example.platform { + requires java.base mandated; + requires java.sql; + requires transitive java.xml; + requires static java.compiler; + + exports com.example.platform.api; + exports com.example.platform.internal to java.logging; + + opens com.example.platform.model; + opens com.example.platform.persistence to java.sql; + + uses java.sql.Driver; + + provides java.sql.Driver with com.example.platform.impl.ExampleSqlDriver; +} diff --git a/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/platform-1.0.0-bytecode.txt b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/platform-1.0.0-bytecode.txt new file mode 100644 index 00000000..b5f754b4 --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/platform-1.0.0-bytecode.txt @@ -0,0 +1,342 @@ +class com.example.platform.api.ApiMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: ApiMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/api/ApiMarker + 8: Utf8StringConstant "com/example/platform/api/ApiMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/api/ApiMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "ApiMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 5 0 this Lcom/example/platform/api/ApiMarker; +class com.example.platform.impl.ExampleSqlDriver + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: ExampleSqlDriver.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // java/sql/DriverPropertyInfo + 8: Utf8StringConstant "java/sql/DriverPropertyInfo" + 9: MethodReference #10.#11 // java/util/logging/Logger.getGlobal:()Ljava/util/logging/Logger; + 10: TypeInfo #12 // java/util/logging/Logger + 11: NameAndTypeDescriptor #13.#14 // getGlobal:()Ljava/util/logging/Logger; + 12: Utf8StringConstant "java/util/logging/Logger" + 13: Utf8StringConstant "getGlobal" + 14: Utf8StringConstant "()Ljava/util/logging/Logger;" + 15: TypeInfo #16 // com/example/platform/impl/ExampleSqlDriver + 16: Utf8StringConstant "com/example/platform/impl/ExampleSqlDriver" + 17: TypeInfo #18 // java/sql/Driver + 18: Utf8StringConstant "java/sql/Driver" + 19: Utf8StringConstant "Code" + 20: Utf8StringConstant "LineNumberTable" + 21: Utf8StringConstant "LocalVariableTable" + 22: Utf8StringConstant "this" + 23: Utf8StringConstant "Lcom/example/platform/impl/ExampleSqlDriver;" + 24: Utf8StringConstant "connect" + 25: Utf8StringConstant "(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;" + 26: Utf8StringConstant "url" + 27: Utf8StringConstant "Ljava/lang/String;" + 28: Utf8StringConstant "info" + 29: Utf8StringConstant "Ljava/util/Properties;" + 30: Utf8StringConstant "Exceptions" + 31: TypeInfo #32 // java/sql/SQLException + 32: Utf8StringConstant "java/sql/SQLException" + 33: Utf8StringConstant "acceptsURL" + 34: Utf8StringConstant "(Ljava/lang/String;)Z" + 35: Utf8StringConstant "getPropertyInfo" + 36: Utf8StringConstant "(Ljava/lang/String;Ljava/util/Properties;)[Ljava/sql/DriverPropertyInfo;" + 37: Utf8StringConstant "getMajorVersion" + 38: Utf8StringConstant "()I" + 39: Utf8StringConstant "getMinorVersion" + 40: Utf8StringConstant "jdbcCompliant" + 41: Utf8StringConstant "()Z" + 42: Utf8StringConstant "getParentLogger" + 43: Utf8StringConstant "SourceFile" + 44: Utf8StringConstant "ExampleSqlDriver.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 5 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public java.sql.Connection connect(java.lang.String url, java.util.Properties info) throws java.sql.SQLException; + Flags: PUBLIC + Code: + stack=1, locals=3, arguments=2 + 0: aconst_null + 1: areturn + Exceptions: + throws java.sql.SQLException + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + 0 2 1 url Ljava/lang/String; + 0 2 2 info Ljava/util/Properties; + + public boolean acceptsURL(java.lang.String url) throws java.sql.SQLException; + Flags: PUBLIC + Code: + stack=1, locals=2, arguments=1 + 0: iconst_0 + 1: ireturn + Exceptions: + throws java.sql.SQLException + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + 0 2 1 url Ljava/lang/String; + + public java.sql.DriverPropertyInfo[] getPropertyInfo(java.lang.String url, java.util.Properties info) throws java.sql.SQLException; + Flags: PUBLIC + Code: + stack=1, locals=3, arguments=2 + 0: iconst_0 + 1: anewarray Ljava/sql/DriverPropertyInfo; + 4: areturn + Exceptions: + throws java.sql.SQLException + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 5 0 this Lcom/example/platform/impl/ExampleSqlDriver; + 0 5 1 url Ljava/lang/String; + 0 5 2 info Ljava/util/Properties; + + public int getMajorVersion(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: iconst_1 + 1: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public int getMinorVersion(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: iconst_0 + 1: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public boolean jdbcCompliant(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: iconst_0 + 1: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public java.util.logging.Logger getParentLogger(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: invokestatic java/util/logging/Logger.getGlobal:()Ljava/util/logging/Logger; + 3: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 4 0 this Lcom/example/platform/impl/ExampleSqlDriver; +class com.example.platform.internal.InternalMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: InternalMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/internal/InternalMarker + 8: Utf8StringConstant "com/example/platform/internal/InternalMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/internal/InternalMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "InternalMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------------- + 0 5 0 this Lcom/example/platform/internal/InternalMarker; +class com.example.platform.model.ModelMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: ModelMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/model/ModelMarker + 8: Utf8StringConstant "com/example/platform/model/ModelMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/model/ModelMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "ModelMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------- + 0 5 0 this Lcom/example/platform/model/ModelMarker; +class com.example.platform.persistence.PersistenceMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: PersistenceMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/persistence/PersistenceMarker + 8: Utf8StringConstant "com/example/platform/persistence/PersistenceMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/persistence/PersistenceMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "PersistenceMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------------------- + 0 5 0 this Lcom/example/platform/persistence/PersistenceMarker; +module com.example.platform + Minor version: 0 + Major version: 65 + SourceFile: module-info.java + ModulePackages: com.example.platform.api + com.example.platform.impl + com.example.platform.internal + com.example.platform.model + com.example.platform.persistence + Constant Pool: + 1: TypeInfo #2 // module-info + 2: Utf8StringConstant "module-info" + 3: Utf8StringConstant "SourceFile" + 4: Utf8StringConstant "module-info.java" + 5: Utf8StringConstant "Module" + 6: Module #7 // com.example.platform + 7: Utf8StringConstant "com.example.platform" + 8: Utf8StringConstant "1.0.0" + 9: Module #10 // java.base + 10: Utf8StringConstant "java.base" + 11: Utf8StringConstant "21.0.6" + 12: Module #13 // java.sql + 13: Utf8StringConstant "java.sql" + 14: Module #15 // java.xml + 15: Utf8StringConstant "java.xml" + 16: Module #17 // java.compiler + 17: Utf8StringConstant "java.compiler" + 18: Package #19 // com/example/platform/api + 19: Utf8StringConstant "com/example/platform/api" + 20: Package #21 // com/example/platform/internal + 21: Utf8StringConstant "com/example/platform/internal" + 22: Module #23 // java.logging + 23: Utf8StringConstant "java.logging" + 24: Package #25 // com/example/platform/model + 25: Utf8StringConstant "com/example/platform/model" + 26: Package #27 // com/example/platform/persistence + 27: Utf8StringConstant "com/example/platform/persistence" + 28: TypeInfo #29 // java/sql/Driver + 29: Utf8StringConstant "java/sql/Driver" + 30: TypeInfo #31 // com/example/platform/impl/ExampleSqlDriver + 31: Utf8StringConstant "com/example/platform/impl/ExampleSqlDriver" + 32: Utf8StringConstant "ModulePackages" + 33: Utf8StringConstant "com/example/platform/impl" + 34: Package #33 // com/example/platform/impl + + requires java.base mandated; + requires java.sql; + requires transitive java.xml; + requires static java.compiler; + + exports com/example/platform/api; + exports com/example/platform/internal to java.logging; + + opens com/example/platform/model; + opens com/example/platform/persistence to java.sql; + + uses java/sql/Driver; + + provides java/sql/Driver with com/example/platform/impl/ExampleSqlDriver; From 735dae57ccc689d5ab80452b418fbc6544dd190a Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 18:30:33 +0100 Subject: [PATCH 52/58] Update coverage.yml --- .github/workflows/coverage.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index e55eed25..06765d74 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -34,4 +34,6 @@ jobs: uses: codecov/codecov-action@v5 with: files: "build/reports/jacoco/jacocoRootReport/jacocoRootReport.xml" + disable_search: true fail_ci_if_error: true + verbose: true From a4388d4102e0b6cf277613df45ca598a5a9fd2b4 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 18:41:28 +0100 Subject: [PATCH 53/58] Update build.gradle --- build.gradle | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index e6a0d223..cdefca1b 100644 --- a/build.gradle +++ b/build.gradle @@ -293,12 +293,11 @@ task jacocoRootReport(type: JacocoReport, dependsOn: tasks.jacocoMerge) { project.afterEvaluate { // The JacocoReport tasks are the source of truth for class files and sources. def reportTasks = getReportTasks(tasks.jacocoRootReport) - classDirectories.from project.files({ - reportTasks.collect {it.classDirectories}.findAll {it != null} - }) - sourceDirectories.from project.files({ - reportTasks.collect {it.sourceDirectories}.findAll {it != null} - }) + def allClassDirs = files(reportTasks.collectMany { it.classDirectories.files }) + def allSourceDirs = files(reportTasks.collectMany { it.sourceDirectories.files }) + + classDirectories.setFrom(allClassDirs) + sourceDirectories.setFrom(allSourceDirs) } reports { From eed213bbc232fddd70f881e3d9688ae777513775 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sat, 3 Jan 2026 19:05:02 +0100 Subject: [PATCH 54/58] Update build.gradle --- build.gradle | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index cdefca1b..b9e24fe3 100644 --- a/build.gradle +++ b/build.gradle @@ -290,17 +290,15 @@ task jacocoRootReport(type: JacocoReport, dependsOn: tasks.jacocoMerge) { logger.lifecycle 'Using aggregated file: ' + tasks.jacocoMerge.destinationFile executionData.from tasks.jacocoMerge.destinationFile - project.afterEvaluate { - // The JacocoReport tasks are the source of truth for class files and sources. - def reportTasks = getReportTasks(tasks.jacocoRootReport) - def allClassDirs = files(reportTasks.collectMany { it.classDirectories.files }) - def allSourceDirs = files(reportTasks.collectMany { it.sourceDirectories.files }) + project.afterEvaluate { + def coveredProjects = getProjectList().findAll { it != rootProject && it.plugins.hasPlugin('java') } - classDirectories.setFrom(allClassDirs) - sourceDirectories.setFrom(allSourceDirs) - } + classDirectories.setFrom(files(coveredProjects.collect { it.sourceSets.main.output.classesDirs })) + sourceDirectories.setFrom(files(coveredProjects.collect { it.sourceSets.main.allSource.srcDirs })) + additionalSourceDirs.setFrom(files(coveredProjects.collect { it.sourceSets.main.allSource.srcDirs })) + } - reports { + reports { xml.enabled = true html.enabled = true } From cff51d8310626a47753968d0f82754e86f31cb5a Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 4 Jan 2026 13:04:17 +0100 Subject: [PATCH 55/58] update jacoco version : 0.8.12 -> 0.8.14 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b9e24fe3..069d557a 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ allprojects { apply plugin: 'jacoco' jacoco { - toolVersion = '0.8.12' + toolVersion = '0.8.14' } buildDir = rootDir.canonicalPath + "/build/" + rootProject.relativePath(projectDir.canonicalPath) From f609d3aabbae95c12c3955542a8ce5ba0f26d2e6 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 4 Jan 2026 14:12:02 +0100 Subject: [PATCH 56/58] remove jacoco merge --- .github/workflows/coverage.yml | 4 +-- build.gradle | 59 ---------------------------------- 2 files changed, 1 insertion(+), 62 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 06765d74..f26eff0d 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -28,12 +28,10 @@ jobs: run: chmod +x ./gradlew - name: Run tests and generate merged JaCoCo report - run: ./gradlew --no-daemon clean test jacocoRootReport + run: ./gradlew --no-daemon jacocoTestReport - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: - files: "build/reports/jacoco/jacocoRootReport/jacocoRootReport.xml" - disable_search: true fail_ci_if_error: true verbose: true diff --git a/build.gradle b/build.gradle index 069d557a..11d7292b 100644 --- a/build.gradle +++ b/build.gradle @@ -244,62 +244,3 @@ subprojects { } } } - -def getProjectList() { - // These projects are considered. Replace with a different list as needed. - subprojects + project -} - -task jacocoMerge(type: JacocoMerge) { - group = LifecycleBasePlugin.VERIFICATION_GROUP - description = 'Merge the JaCoCo data files from all subprojects into one' - project.afterEvaluate { // do it at the end of the config phase to be sure all information is present - FileCollection execFiles = project.objects.fileCollection() // an empty FileCollection - getProjectList().each { Project subproject -> - if (subproject.pluginManager.hasPlugin('jacoco')) { - def testTasks = subproject.tasks.withType(Test) - dependsOn(testTasks) // ensure that .exec files are actually present - - testTasks.each { Test task -> - // The JacocoTaskExtension is the source of truth for the location of the .exec file. - JacocoTaskExtension extension = task.getExtensions().findByType(JacocoTaskExtension.class); - if (extension != null) { - execFiles.from extension.getDestinationFile() - } - } - } - } - executionData = execFiles - } - doFirst { - // .exec files might be missing if a project has no tests. Filter in execution phase. - executionData = executionData.filter { it.canRead() } - } -} - -def getReportTasks(JacocoReport pRootTask) { - getProjectList().collect { - it.tasks.withType(JacocoReport).findAll { it != pRootTask } - }.flatten() -} - -task jacocoRootReport(type: JacocoReport, dependsOn: tasks.jacocoMerge) { - group = LifecycleBasePlugin.VERIFICATION_GROUP - description = 'Generates an aggregate report from all subprojects' - - logger.lifecycle 'Using aggregated file: ' + tasks.jacocoMerge.destinationFile - executionData.from tasks.jacocoMerge.destinationFile - - project.afterEvaluate { - def coveredProjects = getProjectList().findAll { it != rootProject && it.plugins.hasPlugin('java') } - - classDirectories.setFrom(files(coveredProjects.collect { it.sourceSets.main.output.classesDirs })) - sourceDirectories.setFrom(files(coveredProjects.collect { it.sourceSets.main.allSource.srcDirs })) - additionalSourceDirs.setFrom(files(coveredProjects.collect { it.sourceSets.main.allSource.srcDirs })) - } - - reports { - xml.enabled = true - html.enabled = true - } -} From 56f1b7bace8ade64855bbd1d1c09493eec0bd62b Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 4 Jan 2026 21:34:11 +0100 Subject: [PATCH 57/58] migrate to Gradle 7 and use jacoco-report-aggregation plugin --- .github/workflows/coverage.yml | 4 +- Procyon.CompilerTools/build.gradle | 6 +- Procyon.Decompiler/build.gradle | 12 +- Procyon.Expressions/build.gradle | 4 +- Procyon.Reflection/build.gradle | 2 +- build.gradle | 163 ++++++------ gradle/wrapper/gradle-wrapper.jar | Bin 53637 -> 61624 bytes gradle/wrapper/gradle-wrapper.properties | 6 +- gradlew | 300 +++++++++++++++-------- gradlew.bat | 66 ++--- 10 files changed, 332 insertions(+), 231 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f26eff0d..7f779989 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -28,10 +28,12 @@ jobs: run: chmod +x ./gradlew - name: Run tests and generate merged JaCoCo report - run: ./gradlew --no-daemon jacocoTestReport + run: ./gradlew --no-daemon testCodeCoverageReport - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: fail_ci_if_error: true verbose: true + files: build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml + diff --git a/Procyon.CompilerTools/build.gradle b/Procyon.CompilerTools/build.gradle index 89e8578f..1b76c000 100644 --- a/Procyon.CompilerTools/build.gradle +++ b/Procyon.CompilerTools/build.gradle @@ -1,7 +1,7 @@ compileTestJava.options.encoding = 'UTF-8' dependencies { - compile project(':Procyon.Core') - testCompile project(':Procyon.Reflection') - testCompile files('src/test/resources') + implementation project(':Procyon.Core') + testImplementation project(':Procyon.Reflection') + testImplementation files('src/test/resources') } diff --git a/Procyon.Decompiler/build.gradle b/Procyon.Decompiler/build.gradle index 696ab3ae..535b0458 100644 --- a/Procyon.Decompiler/build.gradle +++ b/Procyon.Decompiler/build.gradle @@ -1,18 +1,16 @@ -uploadArchives.enabled = false - jar { manifest { attributes 'Title': archivesBaseName, 'Manifest-Version': '1.0', 'Version': version, 'Main-Class' : 'com.strobel.decompiler.DecompilerDriver' } from { - configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + configurations.implementation.collect { it.isDirectory() ? it : zipTree(it) } } } dependencies { - compile 'com.beust:jcommander:1.82' - compile project(':Procyon.Core') - compile project(':Procyon.CompilerTools') - testCompile 'commons-io:commons-io:2.20.0' + implementation 'com.beust:jcommander:1.82' + implementation project(':Procyon.Core') + implementation project(':Procyon.CompilerTools') + testImplementation 'commons-io:commons-io:2.20.0' } diff --git a/Procyon.Expressions/build.gradle b/Procyon.Expressions/build.gradle index fbba7a05..543a8026 100644 --- a/Procyon.Expressions/build.gradle +++ b/Procyon.Expressions/build.gradle @@ -1,6 +1,6 @@ dependencies { - compile project(':Procyon.Core') - compile project(':Procyon.Reflection') + implementation project(':Procyon.Core') + implementation project(':Procyon.Reflection') } /* diff --git a/Procyon.Reflection/build.gradle b/Procyon.Reflection/build.gradle index 4e727b26..773e5e89 100644 --- a/Procyon.Reflection/build.gradle +++ b/Procyon.Reflection/build.gradle @@ -1,5 +1,5 @@ dependencies { - compile project(':Procyon.Core') + implementation project(':Procyon.Core') } /* diff --git a/build.gradle b/build.gradle index 11d7292b..d7d90496 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,34 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent -apply plugin: 'java' -apply plugin: 'maven' -apply plugin: 'idea' +plugins { + id 'java' + id 'maven-publish' + id 'idea' + id 'jacoco' + id 'jacoco-report-aggregation' +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +repositories { + mavenCentral() +} + +jacoco { + toolVersion = '0.8.14' +} + +dependencies { + jacocoAggregation project(':Procyon.Core') + jacocoAggregation project(':Procyon.CompilerTools') + jacocoAggregation project(':Procyon.Decompiler') + jacocoAggregation project(':Procyon.Expressions') + jacocoAggregation project(':Procyon.Reflection') +} archivesBaseName = 'procyon' @@ -35,7 +60,7 @@ final def procyonVersion = getProcyonVersion() allprojects { apply plugin: 'java' apply plugin: 'idea' - apply plugin: 'maven' + apply plugin: 'maven-publish' apply plugin: 'jacoco' jacoco { @@ -47,14 +72,15 @@ allprojects { version procyonVersion group 'com.github.mstrobel' - sourceCompatibility = 1.8 // JDK version + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 repositories { mavenCentral() } dependencies { - testCompile 'junit:junit:4.13.2' + testImplementation 'junit:junit:4.13.2' } } @@ -63,10 +89,9 @@ allprojects { // rootProject.tasks.each { it.enabled = false } rootProject.tasks.withType(DefaultTask).each { it.enabled = true } -rootProject.uploadArchives.enabled = false subprojects { - apply plugin: 'maven' + apply plugin: 'maven-publish' apply plugin: 'signing' final boolean shouldSign = "true".equalsIgnoreCase(System.properties.getProperty("procyon.signing.enabled")) @@ -119,17 +144,6 @@ subprojects { } } } - - finalizedBy jacocoTestReport - } - - jacocoTestReport { - dependsOn test - reports { - xml.enabled true - html.enabled true - csv.enabled false - } } if (project.name == "Procyon.Decompiler") { @@ -169,78 +183,79 @@ subprojects { } } - uploadArchives { - repositories.mavenDeployer { - if (shouldSign) { - beforeDeployment { MavenDeployment deployment -> - signing.signPom(deployment) - } - } - - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots") { - authentication(userName: project.properties.get("procyon.sonatype.username"), - password: project.properties.get("procyon.sonatype.password")) - } - - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2") { - authentication(userName: project.properties.get("procyon.sonatype.username"), - password: project.properties.get("procyon.sonatype.password")) - } - - pom { + publishing { + publications { + mavenJava(MavenPublication) { + from components.java + + artifact jar + artifact javadocJar + artifact sourcesJar + groupId = project.group - version = project.version artifactId = project.archivesBaseName - - project { - name project.archivesBaseName - packaging 'jar' - description 'Procyon' - url 'https://github.com/mstrobel/procyon' - + version = project.version + + pom { + name.set(project.archivesBaseName) + description.set('Procyon') + url.set('https://github.com/mstrobel/procyon') + scm { - url 'https://github.com/mstrobel/procyon' - connection 'scm:git:https://github.com/mstrobel/procyon.git' - developerConnection 'scm:git:https://mstrobel@github.com/mstrobel/procyon.git' + url.set('https://github.com/mstrobel/procyon') + connection.set('scm:git:https://github.com/mstrobel/procyon.git') + developerConnection.set('scm:git:https://mstrobel@github.com/mstrobel/procyon.git') } - + issueManagement { - system 'github' - url 'https://github.com/mstrobel/procyon/issues' + system.set('github') + url.set('https://github.com/mstrobel/procyon/issues') } - + licenses { license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' + name.set('The Apache Software License, Version 2.0') + url.set('http://www.apache.org/licenses/LICENSE-2.0.txt') + distribution.set('repo') } } - + developers { developer { - id 'mstrobel' - name 'Mike Strobel' - roles { - role 'owner' - role 'packager' - role 'developer' - } - } - } - - dependencies { - dependency { - groupId 'junit' - artifactId 'junit' - version '4.11' - scope 'test' -// optional = true + id.set('mstrobel') + name.set('Mike Strobel') } } } } } + + repositories { + maven { + name = 'sonatypeSnapshots' + url = uri('https://oss.sonatype.org/content/repositories/snapshots') + credentials { + username = project.findProperty('procyon.sonatype.username') + password = project.findProperty('procyon.sonatype.password') + } + } + + maven { + name = 'sonatypeReleases' + url = uri('https://oss.sonatype.org/service/local/staging/deploy/maven2') + credentials { + username = project.findProperty('procyon.sonatype.username') + password = project.findProperty('procyon.sonatype.password') + } + } + } + } + + if (shouldSign) { + signing { + sign publishing.publications.mavenJava + } } + } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 05ef575b0cd0173fc735f2857ce4bd594ce4f6bd..afba109285af78dbd2a1d187e33ac4f87c76e392 100644 GIT binary patch literal 61624 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�Zy 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 literal 53637 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 t9m@SZ!E*7&jsr?!t7TL-WYI4eM@gAug8 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -77,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -85,76 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec99730..6689b85b 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -8,20 +24,24 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,44 +65,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From 533b3b4d8c863cfd7b47f8664c10acfbd9644011 Mon Sep 17 00:00:00 2001 From: nbauma109 Date: Sun, 4 Jan 2026 21:37:18 +0100 Subject: [PATCH 58/58] fix coverage.yml --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 7f779989..f1cf9adb 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -35,5 +35,5 @@ jobs: with: fail_ci_if_error: true verbose: true - files: build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml + files: build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml