Minor.
This commit is contained in:
@@ -50,20 +50,20 @@ class DecompiledDataFactory {
|
|||||||
private static final String JET_METHOD = JetMethod.class.getName();
|
private static final String JET_METHOD = JetMethod.class.getName();
|
||||||
private static final String DECOMPILED_COMMENT = "/* compiled code */";
|
private static final String DECOMPILED_COMMENT = "/* compiled code */";
|
||||||
|
|
||||||
private StringBuilder myBuilder = new StringBuilder();
|
private final StringBuilder builder = new StringBuilder();
|
||||||
private ClsFileImpl myClsFile;
|
private final ClsFileImpl clsFile;
|
||||||
private BindingContext myBindingContext;
|
private final BindingContext bindingContext;
|
||||||
private final Map<PsiElement, TextRange> myClsMembersToRanges = new HashMap<PsiElement, TextRange>();
|
private final Map<PsiElement, TextRange> clsMembersToRanges = new HashMap<PsiElement, TextRange>();
|
||||||
|
|
||||||
private Map<ClsElementImpl, JetDeclaration> myClsElementsToJetElements = new HashMap<ClsElementImpl, JetDeclaration>();
|
private final Map<ClsElementImpl, JetDeclaration> clsElementsToJetElements = new HashMap<ClsElementImpl, JetDeclaration>();
|
||||||
private JavaDescriptorResolver myJavaDescriptorResolver;
|
private final JavaDescriptorResolver javaDescriptorResolver;
|
||||||
|
|
||||||
private DecompiledDataFactory(ClsFileImpl clsFile) {
|
private DecompiledDataFactory(ClsFileImpl clsFile) {
|
||||||
myClsFile = clsFile;
|
this.clsFile = clsFile;
|
||||||
Project project = myClsFile.getProject();
|
Project project = this.clsFile.getProject();
|
||||||
InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices(BuiltinsScopeExtensionMode.ALL, project);
|
InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices(BuiltinsScopeExtensionMode.ALL, project);
|
||||||
myBindingContext = injector.getBindingTrace().getBindingContext();
|
bindingContext = injector.getBindingTrace().getBindingContext();
|
||||||
myJavaDescriptorResolver = injector.getJavaDescriptorResolver();
|
javaDescriptorResolver = injector.getJavaDescriptorResolver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -72,19 +72,19 @@ class DecompiledDataFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private JetDecompiledData build() {
|
private JetDecompiledData build() {
|
||||||
myBuilder.append("// IntelliJ API Decompiler stub source generated from a class file\n" +
|
builder.append("// IntelliJ API Decompiler stub source generated from a class file\n" +
|
||||||
"// Implementation of methods is not available");
|
"// Implementation of methods is not available");
|
||||||
myBuilder.append("\n\n");
|
builder.append("\n\n");
|
||||||
|
|
||||||
String packageName = myClsFile.getPackageName();
|
String packageName = clsFile.getPackageName();
|
||||||
if (packageName.length() > 0) {
|
if (packageName.length() > 0) {
|
||||||
myBuilder.append("package ").append(packageName).append("\n\n");
|
builder.append("package ").append(packageName).append("\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
PsiClass psiClass = myClsFile.getClasses()[0];
|
PsiClass psiClass = clsFile.getClasses()[0];
|
||||||
|
|
||||||
if (isKotlinNamespaceClass(psiClass)) {
|
if (isKotlinNamespaceClass(psiClass)) {
|
||||||
NamespaceDescriptor nd = myJavaDescriptorResolver.resolveNamespace(new FqName(packageName), DescriptorSearchRule.INCLUDE_KOTLIN);
|
NamespaceDescriptor nd = javaDescriptorResolver.resolveNamespace(new FqName(packageName), DescriptorSearchRule.INCLUDE_KOTLIN);
|
||||||
|
|
||||||
if (nd != null) {
|
if (nd != null) {
|
||||||
for (DeclarationDescriptor member : sortDeclarations(nd.getMemberScope().getAllDescriptors())) {
|
for (DeclarationDescriptor member : sortDeclarations(nd.getMemberScope().getAllDescriptors())) {
|
||||||
@@ -92,29 +92,29 @@ class DecompiledDataFactory {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
appendDescriptor(member, "");
|
appendDescriptor(member, "");
|
||||||
myBuilder.append("\n");
|
builder.append("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ClassDescriptor cd = myJavaDescriptorResolver.resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
|
ClassDescriptor cd = javaDescriptorResolver.resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
|
||||||
if (cd != null) {
|
if (cd != null) {
|
||||||
appendDescriptor(cd, "");
|
appendDescriptor(cd, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JetFile jetFile = JetDummyClassFileViewProvider.createJetFile(myClsFile.getManager(), myClsFile.getVirtualFile(), myBuilder.toString());
|
JetFile jetFile = JetDummyClassFileViewProvider.createJetFile(clsFile.getManager(), clsFile.getVirtualFile(), builder.toString());
|
||||||
for (Map.Entry<PsiElement, TextRange> clsMemberToRange : myClsMembersToRanges.entrySet()) {
|
for (Map.Entry<PsiElement, TextRange> clsMemberToRange : clsMembersToRanges.entrySet()) {
|
||||||
PsiElement clsMember = clsMemberToRange.getKey();
|
PsiElement clsMember = clsMemberToRange.getKey();
|
||||||
assert clsMember instanceof ClsElementImpl;
|
assert clsMember instanceof ClsElementImpl;
|
||||||
|
|
||||||
TextRange range = clsMemberToRange.getValue();
|
TextRange range = clsMemberToRange.getValue();
|
||||||
JetDeclaration jetDeclaration = PsiTreeUtil.findElementOfClassAtRange(jetFile, range.getStartOffset(), range.getEndOffset(), JetDeclaration.class);
|
JetDeclaration jetDeclaration = PsiTreeUtil.findElementOfClassAtRange(jetFile, range.getStartOffset(), range.getEndOffset(), JetDeclaration.class);
|
||||||
assert jetDeclaration != null;
|
assert jetDeclaration != null;
|
||||||
myClsElementsToJetElements.put((ClsElementImpl) clsMember, jetDeclaration);
|
clsElementsToJetElements.put((ClsElementImpl) clsMember, jetDeclaration);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new JetDecompiledData(jetFile, myClsElementsToJetElements);
|
return new JetDecompiledData(jetFile, clsElementsToJetElements);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<DeclarationDescriptor> sortDeclarations(Collection<DeclarationDescriptor> input) {
|
private static List<DeclarationDescriptor> sortDeclarations(Collection<DeclarationDescriptor> input) {
|
||||||
@@ -124,33 +124,33 @@ class DecompiledDataFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
|
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
|
||||||
int startOffset = myBuilder.length();
|
int startOffset = builder.length();
|
||||||
String renderedDescriptor = DescriptorRenderer.COMPACT_WITH_MODIFIERS.render(descriptor);
|
String renderedDescriptor = DescriptorRenderer.COMPACT_WITH_MODIFIERS.render(descriptor);
|
||||||
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
|
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
|
||||||
myBuilder.append(renderedDescriptor);
|
builder.append(renderedDescriptor);
|
||||||
int endOffset = myBuilder.length();
|
int endOffset = builder.length();
|
||||||
|
|
||||||
if (descriptor instanceof FunctionDescriptor || descriptor instanceof PropertyDescriptor) {
|
if (descriptor instanceof FunctionDescriptor || descriptor instanceof PropertyDescriptor) {
|
||||||
if (((CallableMemberDescriptor) descriptor).getModality() != Modality.ABSTRACT) {
|
if (((CallableMemberDescriptor) descriptor).getModality() != Modality.ABSTRACT) {
|
||||||
if (descriptor instanceof FunctionDescriptor) {
|
if (descriptor instanceof FunctionDescriptor) {
|
||||||
myBuilder.append(" { ").append(DECOMPILED_COMMENT).append(" }");
|
builder.append(" { ").append(DECOMPILED_COMMENT).append(" }");
|
||||||
endOffset = myBuilder.length();
|
endOffset = builder.length();
|
||||||
}
|
}
|
||||||
else { // descriptor instanceof PropertyDescriptor
|
else { // descriptor instanceof PropertyDescriptor
|
||||||
if (((PropertyDescriptor) descriptor).getModality() != Modality.ABSTRACT) {
|
if (((PropertyDescriptor) descriptor).getModality() != Modality.ABSTRACT) {
|
||||||
myBuilder.append(" ").append(DECOMPILED_COMMENT);
|
builder.append(" ").append(DECOMPILED_COMMENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (descriptor instanceof ClassDescriptor) {
|
else if (descriptor instanceof ClassDescriptor) {
|
||||||
myBuilder.append(" {\n");
|
builder.append(" {\n");
|
||||||
ClassDescriptor classDescriptor = (ClassDescriptor) descriptor;
|
ClassDescriptor classDescriptor = (ClassDescriptor) descriptor;
|
||||||
boolean firstPassed = false;
|
boolean firstPassed = false;
|
||||||
String subindent = indent + " ";
|
String subindent = indent + " ";
|
||||||
if (classDescriptor.getClassObjectDescriptor() != null) {
|
if (classDescriptor.getClassObjectDescriptor() != null) {
|
||||||
firstPassed = true;
|
firstPassed = true;
|
||||||
myBuilder.append(subindent);
|
builder.append(subindent);
|
||||||
appendDescriptor(classDescriptor.getClassObjectDescriptor(), subindent);
|
appendDescriptor(classDescriptor.getClassObjectDescriptor(), subindent);
|
||||||
}
|
}
|
||||||
for (DeclarationDescriptor member : sortDeclarations(classDescriptor.getDefaultType().getMemberScope().getAllDescriptors())) {
|
for (DeclarationDescriptor member : sortDeclarations(classDescriptor.getDefaultType().getMemberScope().getAllDescriptors())) {
|
||||||
@@ -162,22 +162,22 @@ class DecompiledDataFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (firstPassed) {
|
if (firstPassed) {
|
||||||
myBuilder.append("\n");
|
builder.append("\n");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
firstPassed = true;
|
firstPassed = true;
|
||||||
}
|
}
|
||||||
myBuilder.append(subindent);
|
builder.append(subindent);
|
||||||
appendDescriptor(member, subindent);
|
appendDescriptor(member, subindent);
|
||||||
}
|
}
|
||||||
myBuilder.append(indent).append("}");
|
builder.append(indent).append("}");
|
||||||
endOffset = myBuilder.length();
|
endOffset = builder.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
myBuilder.append("\n");
|
builder.append("\n");
|
||||||
PsiElement clsMember = BindingContextUtils.descriptorToDeclaration(myBindingContext, descriptor);
|
PsiElement clsMember = BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor);
|
||||||
if (clsMember != null) {
|
if (clsMember != null) {
|
||||||
myClsMembersToRanges.put(clsMember, new TextRange(startOffset, endOffset));
|
clsMembersToRanges.put(clsMember, new TextRange(startOffset, endOffset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user