remove offset from LightFunExprUsage

This commit is contained in:
Dmitry Batkovich
2016-09-27 17:42:35 +03:00
parent 88cb794787
commit 99a8cbb31a
12 changed files with 27 additions and 109 deletions
@@ -6,7 +6,7 @@ import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.tree.JCTree;
import org.jetbrains.jps.javac.ast.api.JavacDefSymbol;
import org.jetbrains.jps.javac.ast.api.JavacRefSymbol;
/**
* Used via reflection in {@link JavacTreeRefScanner#createASTScanner()}
@@ -18,7 +18,7 @@ public class Javac8RefScanner extends JavacTreeRefScanner {
JCTree.JCLambda lambda = (JCTree.JCLambda)node;
final Type type = lambda.type;
final Symbol.TypeSymbol symbol = type.asElement();
sink.sinkDeclaration(new JavacDefSymbol(symbol, Tree.Kind.LAMBDA_EXPRESSION, lambda.pos));
sink.sinkReference(new JavacRefSymbol(symbol, Tree.Kind.LAMBDA_EXPRESSION));
return super.visitLambdaExpression(node, sink);
}
@@ -26,7 +26,8 @@ public class Javac8RefScanner extends JavacTreeRefScanner {
public Tree visitMemberReference(MemberReferenceTree node, JavacTreeScannerSink sink) {
JCTree.JCMemberReference memberRef = (JCTree.JCMemberReference)node;
final Symbol methodSymbol = memberRef.sym;
sink.sinkDeclaration(new JavacDefSymbol(methodSymbol, Tree.Kind.MEMBER_REFERENCE, memberRef.pos));
sink.sinkReference(new JavacRefSymbol(methodSymbol, Tree.Kind.IDENTIFIER));
sink.sinkReference(new JavacRefSymbol(memberRef.type.asElement(), Tree.Kind.MEMBER_REFERENCE));
return super.visitMemberReference(node, sink);
}
}
@@ -5,7 +5,7 @@ Backward References:
Lambda in Lambda
Lambda.<init>(0) in Lambda
Lambda.main(1) in Lambda
fun_expr(java.lang.Runnable at 80) in Lambda
fun_expr(java.lang.Runnable) in Lambda
java.lang.Object.<init>(0) in Lambda
java.lang.String in Lambda
java.lang.Thread in Lambda
@@ -5,6 +5,7 @@ Backward References:
MethodReference in MethodReference
MethodReference.<init>(0) in MethodReference
MethodReference.main(1) in MethodReference
fun_expr(java.lang.Runnable) in MethodReference
java.lang.Object.<init>(0) in MethodReference
java.lang.String in MethodReference
java.lang.Thread in MethodReference
@@ -85,17 +85,15 @@ public class BackwardReferenceIndexWriter {
myIndex.close();
}
synchronized List<LightUsage> asLightUsages(Collection<JavacRefSymbol> symbols) {
synchronized void writeReferences(JavaFileObject file, Collection<JavacRefSymbol> refs) {
final ByteArrayEnumerator byteSeqEum = myIndex.getByteSeqEum();
return ContainerUtil.mapNotNull(symbols, new Function<JavacRefSymbol, LightUsage>() {
final List<LightUsage> usages = ContainerUtil.mapNotNull(refs, new Function<JavacRefSymbol, LightUsage>() {
@Override
public LightUsage fun(JavacRefSymbol symbol) {
return LightUsage.fromSymbol(symbol, byteSeqEum);
}
});
}
synchronized void writeReferences(JavaFileObject file, Collection<LightUsage> usages) {
final int fileId = enumerateFile(file);
if (myRebuild) {
for (LightUsage usage : usages) {
@@ -18,12 +18,10 @@ package org.jetbrains.jps.backwardRefs;
import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Type;
import org.jetbrains.jps.javac.ast.api.JavacDefSymbol;
import org.jetbrains.jps.javac.ast.api.JavacFileReferencesRegistrar;
import org.jetbrains.jps.javac.ast.api.JavacRefSymbol;
import javax.tools.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -45,11 +43,8 @@ public class BackwardReferenceRegistrar implements JavacFileReferencesRegistrar
}
@Override
public void registerFile(JavaFileObject file, Set<JavacRefSymbol> refs, Collection<JavacDefSymbol> defs) {
List<JavacRefSymbol> fileIndexData = null;
for (JavacDefSymbol def : defs) {
public void registerFile(JavaFileObject file, Set<JavacRefSymbol> refs, Collection<JavacRefSymbol> defs) {
for (JavacRefSymbol def : defs) {
Tree.Kind kind = def.getPlaceKind();
if (kind == Tree.Kind.CLASS) {
Symbol.ClassSymbol sym = (Symbol.ClassSymbol)def.getSymbol();
@@ -70,22 +65,8 @@ public class BackwardReferenceRegistrar implements JavacFileReferencesRegistrar
}
myWriter.writeHierarchy(sym, supers);
}
else if (kind == LightUsage.MEMBER_REFERENCE || kind == LightUsage.LAMBDA_EXPRESSION) {
if (fileIndexData == null) {
fileIndexData = new ArrayList<JavacRefSymbol>();
}
fileIndexData.add(def);
}
}
final List<LightUsage> usages;
if (fileIndexData != null) {
fileIndexData.addAll(refs);
usages = myWriter.asLightUsages(fileIndexData);
}
else {
usages = myWriter.asLightUsages(refs);
}
myWriter.writeReferences(file, usages);
myWriter.writeReferences(file, refs);
}
}
@@ -24,7 +24,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.builders.java.dependencyView.RW;
import org.jetbrains.jps.builders.storage.BuildDataCorruptedException;
import org.jetbrains.jps.javac.ast.api.JavacDefSymbol;
import org.jetbrains.jps.javac.ast.api.JavacRefSymbol;
import java.io.DataInput;
@@ -219,15 +218,8 @@ public abstract class LightUsage implements RW.Savable {
}
public static class LightFunExprUsage extends LightUsage {
private final int myOffset;
public LightFunExprUsage(int owner, int offset) {
public LightFunExprUsage(int owner) {
super(owner);
myOffset = offset;
}
public int getOffset() {
return myOffset;
}
@NotNull
@@ -241,7 +233,6 @@ public abstract class LightUsage implements RW.Savable {
try {
out.writeByte(FUN_EXPR_MARKER);
DataInputOutputUtil.writeINT(out, getOwner());
DataInputOutputUtil.writeINT(out, getOffset());
}
catch (IOException e) {
throw new BuildDataCorruptedException(e);
@@ -294,7 +285,7 @@ public abstract class LightUsage implements RW.Savable {
case FIELD_MARKER:
return new LightFieldUsage(DataInputOutputUtil.readINT(in), DataInputOutputUtil.readINT(in));
case FUN_EXPR_MARKER:
return new LightFunExprUsage(DataInputOutputUtil.readINT(in), DataInputOutputUtil.readINT(in));
return new LightFunExprUsage(DataInputOutputUtil.readINT(in));
}
throw new AssertionError();
}
@@ -311,7 +302,7 @@ public abstract class LightUsage implements RW.Savable {
final Tree.Kind kind = refSymbol.getPlaceKind();
if (symbol instanceof Symbol.ClassSymbol) {
if (kind == LAMBDA_EXPRESSION || kind == MEMBER_REFERENCE) {
return new LightFunExprUsage(id(symbol, byteArrayEnumerator), ((JavacDefSymbol)refSymbol).getOffset());
return new LightFunExprUsage(id(symbol, byteArrayEnumerator));
} else if (!isPrivate(symbol) && !isAnonymous(symbol)) {
return new LightClassUsage(id(symbol, byteArrayEnumerator));
}
@@ -26,7 +26,6 @@ import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.util.ClientCodeException;
import com.sun.tools.javac.util.Name;
import gnu.trove.THashSet;
import org.jetbrains.jps.javac.ast.api.JavacDefSymbol;
import org.jetbrains.jps.javac.ast.api.JavacFileReferencesRegistrar;
import org.jetbrains.jps.javac.ast.api.JavacRefSymbol;
import org.jetbrains.jps.service.JpsServiceManager;
@@ -109,10 +108,10 @@ public class JavacReferencesCollector {
final Set<JavacRefSymbol> symbols = new THashSet<JavacRefSymbol>();
scanImports(myCurrentCompilationUnit, symbols);
for (JavacFileReferencesRegistrar listener : myOnlyImportsListeners) {
listener.registerFile(sourceFile, symbols, Collections.<JavacDefSymbol>emptySet());
listener.registerFile(sourceFile, symbols, Collections.<JavacRefSymbol>emptySet());
}
if (myFullASTListeners.length != 0) {
final Collection<JavacDefSymbol> defs = new ArrayList<JavacDefSymbol>();
final Collection<JavacRefSymbol> defs = new ArrayList<JavacRefSymbol>();
myAstScanner.scan(myCurrentCompilationUnit, new JavacTreeScannerSink() {
@Override
public void sinkReference(JavacRefSymbol ref) {
@@ -120,7 +119,7 @@ public class JavacReferencesCollector {
}
@Override
public void sinkDeclaration(JavacDefSymbol def) {
public void sinkDeclaration(JavacRefSymbol def) {
defs.add(def);
}
});
@@ -20,7 +20,6 @@ import com.sun.source.util.TreeScanner;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.tree.JCTree;
import org.jetbrains.jps.javac.ast.api.JavacDefSymbol;
import org.jetbrains.jps.javac.ast.api.JavacRefSymbol;
import javax.lang.model.element.ElementKind;
@@ -86,8 +85,9 @@ class JavacTreeRefScanner extends TreeScanner<Tree, JavacTreeScannerSink> {
public Tree visitClass(ClassTree node, JavacTreeScannerSink sink) {
JCTree.JCClassDecl classDecl = (JCTree.JCClassDecl)node;
Symbol.ClassSymbol sym = classDecl.sym;
sink.sinkReference(new JavacRefSymbol(sym, Tree.Kind.CLASS));
sink.sinkDeclaration(new JavacDefSymbol(sym, Tree.Kind.CLASS, classDecl.pos));
final JavacRefSymbol ref = new JavacRefSymbol(sym, Tree.Kind.CLASS);
sink.sinkReference(ref);
sink.sinkDeclaration(ref);
return super.visitClass(node, sink);
}
@@ -15,12 +15,11 @@
*/
package org.jetbrains.jps.javac.ast;
import org.jetbrains.jps.javac.ast.api.JavacDefSymbol;
import org.jetbrains.jps.javac.ast.api.JavacRefSymbol;
interface JavacTreeScannerSink {
void sinkReference(JavacRefSymbol ref);
void sinkDeclaration(JavacDefSymbol def);
void sinkDeclaration(JavacRefSymbol def);
}
@@ -1,52 +0,0 @@
/*
* Copyright 2000-2016 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jps.javac.ast.api;
import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.Symbol;
public class JavacDefSymbol extends JavacRefSymbol {
private final int myOffset;
public JavacDefSymbol(Symbol symbol, Tree.Kind kind, int offset) {
super(symbol, kind);
myOffset = offset;
}
public int getOffset() {
return myOffset;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
JavacDefSymbol symbol = (JavacDefSymbol)o;
if (myOffset != symbol.myOffset) return false;
return true;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + myOffset;
return result;
}
}
@@ -25,5 +25,5 @@ public interface JavacFileReferencesRegistrar {
boolean onlyImports();
void registerFile(JavaFileObject file, Set<JavacRefSymbol> refs, Collection<JavacDefSymbol> defs);
void registerFile(JavaFileObject file, Set<JavacRefSymbol> refs, Collection<JavacRefSymbol> defs);
}
@@ -19,13 +19,13 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.CharsetToolkit
import com.intellij.util.PathUtil
import com.sun.tools.javac.util.Convert
import org.jetbrains.jps.builders.JpsBuildTestCase
import org.jetbrains.jps.builders.TestProjectBuilderLogger
import org.jetbrains.jps.builders.logging.BuildLoggingManager
import org.jetbrains.jps.backwardRefs.BackwardReferenceIndexWriter
import org.jetbrains.jps.backwardRefs.ByteArrayEnumerator
import org.jetbrains.jps.backwardRefs.CompilerBackwardReferenceIndex
import org.jetbrains.jps.backwardRefs.LightUsage
import org.jetbrains.jps.backwardRefs.BackwardReferenceIndexWriter
import org.jetbrains.jps.builders.JpsBuildTestCase
import org.jetbrains.jps.builders.TestProjectBuilderLogger
import org.jetbrains.jps.builders.logging.BuildLoggingManager
import java.io.File
abstract class ReferenceIndexTestBase : JpsBuildTestCase() {
@@ -129,7 +129,7 @@ abstract class ReferenceIndexTestBase : JpsBuildTestCase() {
byteArrayEnumerator) + "(" + this.parameterCount + ")"
is LightUsage.LightFieldUsage -> this.owner.asName(byteArrayEnumerator) + "." + this.name.asName(byteArrayEnumerator)
is LightUsage.LightClassUsage -> this.owner.asName(byteArrayEnumerator)
is LightUsage.LightFunExprUsage -> "fun_expr(" + this.owner.asName(byteArrayEnumerator) + " at " + this.offset + ")";
is LightUsage.LightFunExprUsage -> "fun_expr(" + this.owner.asName(byteArrayEnumerator) + ")"
else -> throw UnsupportedOperationException()
}
}