summaryrefslogtreecommitdiff
path: root/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java')
-rw-r--r--plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java148
1 files changed, 148 insertions, 0 deletions
diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java
new file mode 100644
index 000000000000..9b6f7edb0019
--- /dev/null
+++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2000-2014 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.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.util.*;
+import java.util.Map.Entry;
+
+
+public class ImportCollector {
+
+ private static final String JAVA_LANG_PACKAGE = "java.lang";
+
+ private Map<String, String> mapSimpleNames = new HashMap<String, String>();
+ private Set<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 += "/";
+ }
+ }
+
+ 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 {
+ 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 boolean writeImports(StringBuilder buffer) {
+ List<String> imports = packImports();
+
+ for (String s : imports) {
+ buffer.append("import ");
+ buffer.append(s);
+ buffer.append(";");
+ buffer.append(DecompilerContext.getNewLineSeparator());
+ }
+
+ return imports.size() > 0;
+ }
+
+ 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) {
+ // exclude a current class or one of the nested ones, java.lang and empty packages
+ if (!setNotImportedNames.contains(ent.getKey()) &&
+ !JAVA_LANG_PACKAGE.equals(ent.getValue()) &&
+ !ent.getValue().isEmpty()) {
+ res.add(ent.getValue() + "." + ent.getKey());
+ }
+ }
+
+ return res;
+ }
+}