diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java index c0d00b8b058c..39991d690508 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.jetbrains.jps.builders.java.dependencyView; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; import gnu.trove.THashMap; import gnu.trove.THashSet; import gnu.trove.TIntHashSet; @@ -33,50 +34,41 @@ import java.util.Set; * @author: db * Date: 31.01.11 */ - class ClassfileAnalyzer { public static final String LAMBDA_FACTORY_CLASS = "java/lang/invoke/LambdaMetafactory"; + private final DependencyContext myContext; ClassfileAnalyzer(DependencyContext context) { this.myContext = context; } - private static class Holder { - private T x = null; - - public void set(final T x) { - this.x = x; - } - - public T get() { - return x; - } - } - private class ClassCrawler extends ClassVisitor { private class AnnotationRetentionPolicyCrawler extends AnnotationVisitor { private AnnotationRetentionPolicyCrawler() { super(Opcodes.ASM5); } - public void visit(String name, Object value) { - } + @Override + public void visit(String name, Object value) { } + @Override public void visitEnum(String name, String desc, String value) { myRetentionPolicy = RetentionPolicy.valueOf(value); } + @Override public AnnotationVisitor visitAnnotation(String name, String desc) { return null; } + @Override public AnnotationVisitor visitArray(String name) { return null; } - public void visitEnd() { - } + @Override + public void visitEnd() { } } private class AnnotationTargetCrawler extends AnnotationVisitor { @@ -84,23 +76,26 @@ class ClassfileAnalyzer { super(Opcodes.ASM5); } - public void visit(String name, Object value) { - } + @Override + public void visit(String name, Object value) { } + @Override public void visitEnum(final String name, String desc, final String value) { myTargets.add(ElemType.valueOf(value)); } + @Override public AnnotationVisitor visitAnnotation(String name, String desc) { return this; } + @Override public AnnotationVisitor visitArray(String name) { return this; } - public void visitEnd() { - } + @Override + public void visitEnd() { } } private class AnnotationCrawler extends AnnotationVisitor { @@ -165,6 +160,7 @@ class ClassfileAnalyzer { return "()L" + name + ";"; } + @Override public void visit(String name, Object value) { final String methodDescr = getMethodDescr(value); final int methodName = myContext.get(name); @@ -180,6 +176,7 @@ class ClassfileAnalyzer { myUsedArguments.add(methodName); } + @Override public void visitEnum(String name, String desc, String value) { final int methodName = myContext.get(name); final String methodDescr = "()" + desc; @@ -190,15 +187,18 @@ class ClassfileAnalyzer { myUsedArguments.add(methodName); } + @Override public AnnotationVisitor visitAnnotation(String name, String desc) { return new AnnotationCrawler((TypeRepr.ClassType)TypeRepr.getType(myContext, myContext.get(desc)), myTarget); } + @Override public AnnotationVisitor visitArray(String name) { myUsedArguments.add(myContext.get(name)); return this; } + @Override public void visitEnd() { final TIntHashSet s = myAnnotationArguments.get(myType); @@ -218,14 +218,17 @@ class ClassfileAnalyzer { } private final SignatureVisitor mySignatureCrawler = new BaseSignatureVisitor() { + @Override public SignatureVisitor visitClassBound() { return mySignatureWithGenericBoundUsageCrawler; } + @Override public SignatureVisitor visitInterfaceBound() { return mySignatureWithGenericBoundUsageCrawler; } + @Override public SignatureVisitor visitTypeArgument(char wildcard) { return mySignatureWithGenericBoundUsageCrawler; } @@ -248,15 +251,10 @@ class ClassfileAnalyzer { private String[] myInterfaces; private String mySignature; - final Holder myClassNameHolder = new Holder(); - final Holder myOuterClassName = new Holder(); - final Holder myLocalClassFlag = new Holder(); - final Holder myAnonymousClassFlag = new Holder(); - - { - myLocalClassFlag.set(false); - myAnonymousClassFlag.set(false); - } + private final Ref myClassNameHolder = Ref.create(); + private final Ref myOuterClassName = Ref.create(); + private final Ref myLocalClassFlag = Ref.create(false); + private final Ref myAnonymousClassFlag = Ref.create(false); private final Set myMethods = new THashSet(); private final Set myFields = new THashSet(); @@ -264,8 +262,8 @@ class ClassfileAnalyzer { private final Set myTargets = EnumSet.noneOf(ElemType.class); private RetentionPolicy myRetentionPolicy = null; - final Map myAnnotationArguments = new THashMap(); - final Map> myAnnotationTargets = new THashMap>(); + private final Map myAnnotationArguments = new THashMap(); + private final Map> myAnnotationTargets = new THashMap>(); public ClassCrawler(final int fn) { super(Opcodes.ASM5); @@ -277,12 +275,10 @@ class ClassfileAnalyzer { } public Pair> getResult() { - final ClassRepr repr = - myTakeIntoAccount ? new ClassRepr( - myContext, myAccess, myFileName, myName, myContext.get(mySignature), myContext.get(mySuperClass), myInterfaces, - myFields, - myMethods, myTargets, myRetentionPolicy, myContext - .get(myOuterClassName.get()), myLocalClassFlag.get(), myAnonymousClassFlag.get(), myUsages) : null; + ClassRepr repr = myTakeIntoAccount ? new ClassRepr( + myContext, myAccess, myFileName, myName, myContext.get(mySignature), myContext.get(mySuperClass), myInterfaces, + myFields, myMethods, myTargets, myRetentionPolicy, myContext.get(myOuterClassName.get()), myLocalClassFlag.get(), + myAnonymousClassFlag.get(), myUsages) : null; if (repr != null) { repr.updateClassUsages(myContext, myUsages); @@ -348,8 +344,7 @@ class ClassfileAnalyzer { } @Override - public void visitSource(String source, String debug) { - } + public void visitSource(String source, String debug) { } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { @@ -369,7 +364,7 @@ class ClassfileAnalyzer { @Override public MethodVisitor visitMethod(final int access, final String n, final String desc, final String signature, final String[] exceptions) { - final Holder defaultValue = new Holder(); + final Ref defaultValue = Ref.create(); processSignature(signature); @@ -615,67 +610,76 @@ class ClassfileAnalyzer { } private class BaseSignatureVisitor extends SignatureVisitor { - public BaseSignatureVisitor() { super(Opcodes.ASM5); } - public void visitFormalTypeParameter(String name) { - } + @Override + public void visitFormalTypeParameter(String name) { } + @Override public SignatureVisitor visitClassBound() { return this; } + @Override public SignatureVisitor visitInterfaceBound() { return this; } + @Override public SignatureVisitor visitSuperclass() { return this; } + @Override public SignatureVisitor visitInterface() { return this; } + @Override public SignatureVisitor visitParameterType() { return this; } + @Override public SignatureVisitor visitReturnType() { return this; } + @Override public SignatureVisitor visitExceptionType() { return this; } - public void visitBaseType(char descriptor) { - } + @Override + public void visitBaseType(char descriptor) { } - public void visitTypeVariable(String name) { - } + @Override + public void visitTypeVariable(String name) { } + @Override public SignatureVisitor visitArrayType() { return this; } - public void visitInnerClassType(String name) { - } + @Override + public void visitInnerClassType(String name) { } - public void visitTypeArgument() { - } + @Override + public void visitTypeArgument() { } + @Override public SignatureVisitor visitTypeArgument(char wildcard) { return this; } - public void visitEnd() { - } + @Override + public void visitEnd() { } + @Override public void visitClassType(String name) { - final int className = myContext.get(name); + int className = myContext.get(name); myUsages.add(UsageRepr.createClassUsage(myContext, className)); } }