Package org.eclim.plugin.jdt.command.include

Source Code of org.eclim.plugin.jdt.command.include.ImportUtils

/**
* Copyright (C) 2012 - 2014  Eric Van Dewoestine
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.eclim.plugin.jdt.command.include;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import org.eclim.plugin.core.preference.Preferences;

import org.eclipse.core.resources.IProject;

import org.eclipse.jdt.core.ICompilationUnit;

import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ImportDeclaration;

import org.eclipse.jdt.ui.SharedASTProvider;

import org.eclipse.text.edits.InsertEdit;
import org.eclipse.text.edits.MultiTextEdit;
import org.eclipse.text.edits.TextEdit;

/**
* Utilities for working with java imports.
*
* @author Eric Van Dewoestine
*/
public class ImportUtils
{
  public static boolean importsInSameGroup(
      int separationLevel, ImportDeclaration i1, ImportDeclaration i2)
  {
    // -1 = separate based on full package
    //  0 = never separate
    //  n = separate on comparing of n segments of the package.

    if (separationLevel == 0){
      return true;
    }

    List<String> pn1 = packageName(i1);
    List<String> pn2 = packageName(i2);

    for (int i = 0; (i < separationLevel || separationLevel == -1); i++){
      int level = i + 1;
      if (pn1.size() < level){
        return pn2.size() < level;
      }
      if (pn2.size() < level){
        return pn1.size() < level;
      }

      if (!pn1.get(i).equals(pn2.get(i))){
        return false;
      }
    }

    return true;
  }

  public static List<String> packageName(ImportDeclaration imprt)
  {
    String name = imprt.getName().getFullyQualifiedName();
    List<String> pack = new ArrayList<String>();
    for (String part : StringUtils.split(name, '.')){
      if (Character.isUpperCase(part.charAt(0))){
        break;
      }
      pack.add(part);
    }
    return pack;
  }

  public static boolean isImportExcluded(IProject project, String name)
    throws Exception
  {
    String[] patterns = Preferences.getInstance()
      .getArrayValue(project, "org.eclim.java.import.exclude");
    for (String pattern : patterns){
      if (name.matches(pattern)){
        return true;
      }
    }
    return false;
  }

  public static TextEdit importGroupingEdit(
      ICompilationUnit src, Preferences preferences)
    throws Exception
  {
    int separationLevel = preferences.getIntValue(
          src.getJavaProject().getProject(),
          "org.eclim.java.import.package_separation_level");
    CompilationUnit astRoot = SharedASTProvider
      .getAST(src, SharedASTProvider.WAIT_YES, null);

    @SuppressWarnings("unchecked")
    List<ImportDeclaration> imports = astRoot.imports();
    String lineDelim = src.findRecommendedLineSeparator();
    MultiTextEdit edit = new MultiTextEdit();
    ImportDeclaration next = null;
    for (int i = imports.size() - 1; i >= 0; i--){
      ImportDeclaration imprt = imports.get(i);
      int end = imprt.getStartPosition() + imprt.getLength() + lineDelim.length();
      if (next != null &&
          end == next.getStartPosition() &&
          !ImportUtils.importsInSameGroup(separationLevel, imprt, next))
      {
        edit.addChild(new InsertEdit(end, lineDelim));
      }
      next = imprt;
    }

    return edit.getChildrenSize() > 0 ? edit : null;
  }
}
TOP

Related Classes of org.eclim.plugin.jdt.command.include.ImportUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.