java-decompiler: post-import cleanup (formatting and copyright)

This commit is contained in:
Roman Shevchenko
2014-08-28 21:34:14 +04:00
parent 663631f045
commit 076e4393f2
355 changed files with 38995 additions and 36094 deletions

View File

@@ -1,37 +1,37 @@
/*
* Fernflower - The Analytical Java Decompiler
* http://www.reversed-java.com
* Copyright 2000-2014 JetBrains s.r.o.
*
* (C) 2008 - 2010, Stiver
* 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
*
* This software is NEITHER public domain NOR free software
* as per GNU License. See license.txt for more details.
* http://www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE.
* 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.java.decompiler.main.collectors;
public class CounterContainer {
public static final int STATEMENT_COUNTER = 0;
public static final int EXPRENT_COUNTER = 1;
public static final int VAR_COUNTER = 2;
private int[] values = new int[]{1, 1, 1};
public void setCounter(int counter, int value) {
values[counter] = value;
}
public static final int STATEMENT_COUNTER = 0;
public static final int EXPRENT_COUNTER = 1;
public static final int VAR_COUNTER = 2;
public int getCounter(int counter) {
return values[counter];
}
private int[] values = new int[]{1, 1, 1};
public int getCounterAndIncrement(int counter) {
return values[counter]++;
}
public void setCounter(int counter, int value) {
values[counter] = value;
}
public int getCounter(int counter) {
return values[counter];
}
public int getCounterAndIncrement(int counter) {
return values[counter]++;
}
}

View File

@@ -1,157 +1,152 @@
/*
* Fernflower - The Analytical Java Decompiler
* http://www.reversed-java.com
* Copyright 2000-2014 JetBrains s.r.o.
*
* (C) 2008 - 2010, Stiver
* 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
*
* This software is NEITHER public domain NOR free software
* as per GNU License. See license.txt for more details.
* http://www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE.
* 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.java.decompiler.main.collectors;
import org.jetbrains.java.decompiler.main.ClassesProcessor;
import org.jetbrains.java.decompiler.main.ClassesProcessor.ClassNode;
import org.jetbrains.java.decompiler.main.DecompilerContext;
import org.jetbrains.java.decompiler.struct.StructContext;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.*;
import java.util.Map.Entry;
import org.jetbrains.java.decompiler.main.ClassesProcessor;
import org.jetbrains.java.decompiler.main.DecompilerContext;
import org.jetbrains.java.decompiler.main.ClassesProcessor.ClassNode;
import org.jetbrains.java.decompiler.struct.StructContext;
public class ImportCollector {
private static final String JAVA_LANG_PACKAGE = "java.lang";
private HashMap<String, String> mapSimpleNames = new HashMap<String, String>();
private HashSet<String> setNotImportedNames = new HashSet<String>();
private String currentPackageSlash = "";
private String currentPackagePoint = "";
public ImportCollector(ClassNode root) {
String clname = root.classStruct.qualifiedName;
int index = clname.lastIndexOf("/");
if(index >= 0) {
currentPackageSlash = clname.substring(0, index);
currentPackagePoint = currentPackageSlash.replace('/', '.');
currentPackageSlash += "/";
}
}
private static final String JAVA_LANG_PACKAGE = "java.lang";
public String getShortName(String fullname) {
return getShortName(fullname, true);
}
public String getShortName(String fullname, boolean imported) {
ClassesProcessor clproc = DecompilerContext.getClassprocessor();
ClassNode node = clproc.getMapRootClasses().get(fullname.replace('.', '/'));
String retname = null;
if(node != null && node.classStruct.isOwn()) {
retname = node.simpleName;
while(node.parent != null && node.type == ClassNode.CLASS_MEMBER) {
retname = node.parent.simpleName+"."+retname;
node = node.parent;
}
if(node.type == ClassNode.CLASS_ROOT) {
fullname = node.classStruct.qualifiedName;
fullname = fullname.replace('/', '.');
} else {
return retname;
}
} else if(node == null || !node.classStruct.isOwn()) {
fullname = fullname.replace('$', '.');
}
String nshort = fullname;
String npackage = "";
int lastpoint = fullname.lastIndexOf(".");
if(lastpoint >= 0) {
nshort = fullname.substring(lastpoint+1);
npackage = fullname.substring(0, lastpoint);
}
StructContext context = DecompilerContext.getStructcontext();
boolean existsDefaultClass = (context.getClass(currentPackageSlash+nshort) != null
&& !npackage.equals(currentPackagePoint)) // current package
|| (context.getClass(nshort) != null); // default package
if(existsDefaultClass ||
(mapSimpleNames.containsKey(nshort) && !npackage.equals(mapSimpleNames.get(nshort)))) {
return fullname;
} else if(!mapSimpleNames.containsKey(nshort)) {
mapSimpleNames.put(nshort, npackage);
if(!imported) {
setNotImportedNames.add(nshort);
}
}
return retname==null?nshort:retname;
}
public void writeImports(BufferedWriter writer) throws IOException {
private HashMap<String, String> mapSimpleNames = new HashMap<String, String>();
for(String s: packImports()) {
writer.write("import ");
writer.write(s);
writer.write(";");
writer.write(DecompilerContext.getNewLineSeparator());
}
}
private List<String> packImports() {
List<Entry<String, String>> lst = new ArrayList<Entry<String, String>>(mapSimpleNames.entrySet());
Collections.sort(lst, new Comparator<Entry<String, String>>() {
public int compare(Entry<String, String> par0, Entry<String, String> par1) {
int res = par0.getValue().compareTo(par1.getValue());
if(res == 0) {
res = par0.getKey().compareTo(par1.getKey());
}
return res;
}
});
List<String> res = new ArrayList<String>();
for(Entry<String, String> ent: lst) {
if(!setNotImportedNames.contains(ent.getKey()) // not the current class or one of the nested ones. Also not the empty package.
&& !JAVA_LANG_PACKAGE.equals(ent.getValue())
&& ent.getValue().length() > 0) {
private HashSet<String> setNotImportedNames = new HashSet<String>();
String imp = ent.getValue()+"."+ent.getKey();
res.add(imp);
}
}
return res;
}
private String currentPackageSlash = "";
private String currentPackagePoint = "";
public ImportCollector(ClassNode root) {
String clname = root.classStruct.qualifiedName;
int index = clname.lastIndexOf("/");
if (index >= 0) {
currentPackageSlash = clname.substring(0, index);
currentPackagePoint = currentPackageSlash.replace('/', '.');
currentPackageSlash += "/";
}
}
public String getShortName(String fullname) {
return getShortName(fullname, true);
}
public String getShortName(String fullname, boolean imported) {
ClassesProcessor clproc = DecompilerContext.getClassprocessor();
ClassNode node = clproc.getMapRootClasses().get(fullname.replace('.', '/'));
String retname = null;
if (node != null && node.classStruct.isOwn()) {
retname = node.simpleName;
while (node.parent != null && node.type == ClassNode.CLASS_MEMBER) {
retname = node.parent.simpleName + "." + retname;
node = node.parent;
}
if (node.type == ClassNode.CLASS_ROOT) {
fullname = node.classStruct.qualifiedName;
fullname = fullname.replace('/', '.');
}
else {
return retname;
}
}
else if (node == null || !node.classStruct.isOwn()) {
fullname = fullname.replace('$', '.');
}
String nshort = fullname;
String npackage = "";
int lastpoint = fullname.lastIndexOf(".");
if (lastpoint >= 0) {
nshort = fullname.substring(lastpoint + 1);
npackage = fullname.substring(0, lastpoint);
}
StructContext context = DecompilerContext.getStructcontext();
boolean existsDefaultClass = (context.getClass(currentPackageSlash + nshort) != null
&& !npackage.equals(currentPackagePoint)) // current package
|| (context.getClass(nshort) != null); // default package
if (existsDefaultClass ||
(mapSimpleNames.containsKey(nshort) && !npackage.equals(mapSimpleNames.get(nshort)))) {
return fullname;
}
else if (!mapSimpleNames.containsKey(nshort)) {
mapSimpleNames.put(nshort, npackage);
if (!imported) {
setNotImportedNames.add(nshort);
}
}
return retname == null ? nshort : retname;
}
public void writeImports(BufferedWriter writer) throws IOException {
for (String s : packImports()) {
writer.write("import ");
writer.write(s);
writer.write(";");
writer.write(DecompilerContext.getNewLineSeparator());
}
}
private List<String> packImports() {
List<Entry<String, String>> lst = new ArrayList<Entry<String, String>>(mapSimpleNames.entrySet());
Collections.sort(lst, new Comparator<Entry<String, String>>() {
public int compare(Entry<String, String> par0, Entry<String, String> par1) {
int res = par0.getValue().compareTo(par1.getValue());
if (res == 0) {
res = par0.getKey().compareTo(par1.getKey());
}
return res;
}
});
List<String> res = new ArrayList<String>();
for (Entry<String, String> ent : lst) {
if (!setNotImportedNames.contains(ent.getKey()) // not the current class or one of the nested ones. Also not the empty package.
&& !JAVA_LANG_PACKAGE.equals(ent.getValue())
&& ent.getValue().length() > 0) {
String imp = ent.getValue() + "." + ent.getKey();
res.add(imp);
}
}
return res;
}
}

View File

@@ -1,50 +1,51 @@
/*
* Fernflower - The Analytical Java Decompiler
* http://www.reversed-java.com
* Copyright 2000-2014 JetBrains s.r.o.
*
* (C) 2008 - 2010, Stiver
* 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
*
* This software is NEITHER public domain NOR free software
* as per GNU License. See license.txt for more details.
* http://www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE.
* 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.java.decompiler.main.collectors;
import java.util.HashSet;
public class VarNamesCollector {
private HashSet<String> usedNames = new HashSet<String>();
public VarNamesCollector() {}
private HashSet<String> usedNames = new HashSet<String>();
public VarNamesCollector(HashSet<String> setNames) {
usedNames.addAll(setNames);
}
public void addName(String value) {
usedNames.add(value);
}
public VarNamesCollector() {
}
public String getFreeName(int index) {
return getFreeName("var"+index);
}
public String getFreeName(String proposition) {
while(usedNames.contains(proposition)) {
proposition+="x";
}
usedNames.add(proposition);
return proposition;
}
public VarNamesCollector(HashSet<String> setNames) {
usedNames.addAll(setNames);
}
public HashSet<String> getUsedNames() {
return usedNames;
}
public void addName(String value) {
usedNames.add(value);
}
public String getFreeName(int index) {
return getFreeName("var" + index);
}
public String getFreeName(String proposition) {
while (usedNames.contains(proposition)) {
proposition += "x";
}
usedNames.add(proposition);
return proposition;
}
public HashSet<String> getUsedNames() {
return usedNames;
}
}