Merge remote-tracking branch 'origin/master' clion/140.1814
authorDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Mon, 19 Jan 2015 16:08:19 +0000 (19:08 +0300)
committerDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Mon, 19 Jan 2015 16:08:19 +0000 (19:08 +0300)
java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaLineBreakpointTypeBase.java
java/java-analysis-impl/src/org/jetbrains/java/generate/psi/PsiAdapter.java
java/java-impl/src/com/intellij/openapi/projectRoots/JavaVersionServiceImpl.java
java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaVersionService.java
jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeEditorPanel.java
platform/script-debugger/debugger-ui/src/org/jetbrains/debugger/DebuggerSupportUtils.java [new file with mode: 0644]
platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java
platform/util/src/com/intellij/openapi/util/io/FileUtil.java
platform/util/src/com/intellij/util/Restarter.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java

index ebaee1e6d5ee2058a115c156163d20742ad6765f..1be1fb56557d0e09bc143306850815d5cc273ac3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 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.
@@ -16,7 +16,6 @@
 package com.intellij.debugger.ui.breakpoints;
 
 import com.intellij.debugger.engine.DebuggerUtils;
-import com.intellij.execution.filters.LineNumbersMapping;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
 import com.intellij.openapi.fileTypes.StdFileTypes;
@@ -129,9 +128,6 @@ public abstract class JavaLineBreakpointTypeBase<P extends JavaBreakpointPropert
                 result.set(JavaLineBreakpointType.class);
               }
             }
-            else if (file.getUserData(LineNumbersMapping.LINE_NUMBERS_MAPPING_KEY) != null) {
-              result.set(JavaLineBreakpointType.class);
-            }
           }
           if (result.isNull()) {
             result.set(JavaMethodBreakpointType.class);
index 75d620e1f3bead4be35f4673c74e1615f9bf6639..e19f7f578bf9a299242182c8be8dffa3da08d8f2 100644 (file)
@@ -18,8 +18,8 @@ package org.jetbrains.java.generate.psi;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.projectRoots.JavaSdkVersion;
 import com.intellij.openapi.projectRoots.JavaVersionService;
+import com.intellij.openapi.projectRoots.JdkVersionUtil;
 import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
 import com.intellij.psi.codeStyle.CodeStyleManager;
 import com.intellij.psi.codeStyle.JavaCodeStyleManager;
@@ -670,7 +670,11 @@ public class PsiAdapter {
     }
 
   public static int getJavaVersion(PsiElement element) {
-    final JavaSdkVersion sdkVersion = JavaVersionService.getInstance().getJavaSdkVersion(element);
+    JavaSdkVersion sdkVersion = JavaVersionService.getInstance().getJavaSdkVersion(element);
+    if (sdkVersion == null) {
+      sdkVersion = JavaSdkVersion.fromLanguageLevel(PsiUtil.getLanguageLevel(element));
+    }
+
     int version = 0;
     switch (sdkVersion) {
       case JDK_1_0:
index 1a3ce4e0cea2e47048b4a2a3883b878b2e423822..e473f5c67281de64abff2574d23a776dd53d0f93 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.openapi.projectRoots;
 
 import com.intellij.psi.PsiElement;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * @author anna
@@ -28,6 +29,7 @@ public class JavaVersionServiceImpl extends JavaVersionService {
     return JavaSdkVersionUtil.isAtLeast(element, version);
   }
 
+  @Nullable
   @Override
   public JavaSdkVersion getJavaSdkVersion(@NotNull PsiElement element) {
     return JavaSdkVersionUtil.getJavaSdkVersion(element);
index 5108c592c6ac64b5ab7735e40138be83c30994e6..fe1873fdfd8dc46393e88e3bbee60ffa9fd76721 100644 (file)
@@ -23,6 +23,7 @@ import com.intellij.openapi.components.ServiceManager;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.util.PsiUtil;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class JavaVersionService {
   public static JavaVersionService getInstance() {
@@ -33,6 +34,7 @@ public class JavaVersionService {
     return PsiUtil.getLanguageLevel(element).isAtLeast(version.getMaxLanguageLevel());
   }
 
+  @Nullable
   public JavaSdkVersion getJavaSdkVersion(@NotNull PsiElement element) {
     return JavaSdkVersion.fromLanguageLevel(PsiUtil.getLanguageLevel(element));
   }
index 2f82e8df8b21695ad06a9d5b8c511835a1dc2606..f8f576dec0fa977342f29f14dbe7fd8055d99f28 100644 (file)
 package org.jetbrains.jps.incremental;
 
 import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.LowMemoryWatcher;
-import com.intellij.openapi.util.SystemInfo;
-import com.intellij.openapi.util.UserDataHolder;
-import com.intellij.openapi.util.UserDataHolderBase;
+import com.intellij.openapi.util.*;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.SmartList;
@@ -84,7 +81,7 @@ import java.util.concurrent.atomic.AtomicReference;
 public class IncProjectBuilder {
   private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.IncProjectBuilder");
 
-  private static final String CLASSPATH_INDEX_FINE_NAME = "classpath.index";
+  private static final String CLASSPATH_INDEX_FILE_NAME = "classpath.index";
   private static final boolean GENERATE_CLASSPATH_INDEX = Boolean.parseBoolean(System.getProperty(GlobalOptions.GENERATE_CLASSPATH_INDEX_OPTION, "false"));
   private static final boolean SYNC_DELETE = Boolean.parseBoolean(System.getProperty("jps.sync.delete", SystemInfo.isWindows ? "true" : "false"));
   private static final GlobalContextKey<Set<BuildTarget<?>>> TARGET_WITH_CLEARED_OUTPUT = GlobalContextKey.create("_targets_with_cleared_output_");
@@ -334,7 +331,25 @@ public class IncProjectBuilder {
              BuildRunner.PARALLEL_BUILD_ENABLED);
 
     context.addBuildListener(new ChainedTargetsBuildListener(context));
+    
+    //Deletes class loader classpath index files for changed output roots
+    context.addBuildListener(new BuildListener() {
+      @Override
+      public void filesGenerated(Collection<Pair<String, String>> paths) {
+        final Set<File> outputs = new THashSet<File>(FileUtil.FILE_HASHING_STRATEGY);
+        for (Pair<String, String> pair : paths) {
+          outputs.add(new File(pair.getFirst()));
+        }
+        for (File root : outputs) {
+          //noinspection ResultOfMethodCallIgnored
+          new File(root, CLASSPATH_INDEX_FILE_NAME).delete();
+        }
+      }
 
+      @Override
+      public void filesDeleted(Collection<String> paths) {
+      }
+    });
     for (TargetBuilder builder : myBuilderRegistry.getTargetBuilders()) {
       builder.buildStarted(context);
     }
@@ -965,7 +980,7 @@ public class IncProjectBuilder {
         File outputDir = ((ModuleBuildTarget)target).getOutputDir();
         if (outputDir != null && outputDirs.add(outputDir)) {
           try {
-            BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outputDir, CLASSPATH_INDEX_FINE_NAME)));
+            BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outputDir, CLASSPATH_INDEX_FILE_NAME)));
             try {
               writeIndex(writer, outputDir, "");
             }
index f36f1e8f9bc78cfd192878235eb47a1179491e1e..d4802b60188cc159d2f4ee0faaf448414f6365f8 100644 (file)
@@ -38,6 +38,7 @@ import com.intellij.ui.*;
 import com.intellij.ui.components.panels.VerticalLayout;
 import com.intellij.ui.treeStructure.Tree;
 import com.intellij.util.Alarm;
+import com.intellij.util.ArrayUtil;
 import com.intellij.util.Consumer;
 import com.intellij.util.ui.ColorIcon;
 import com.intellij.util.ui.UIUtil;
@@ -237,11 +238,11 @@ public class ScopeEditorPanel {
     myPackageTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
       @Override
       public void valueChanged(TreeSelectionEvent e) {
-        final boolean recursiveEnabled = isButtonEnabled(true, e.getPaths(), e);
+        final boolean recursiveEnabled = isButtonEnabled(true);
         includeRec.setEnabled(recursiveEnabled);
         excludeRec.setEnabled(recursiveEnabled);
 
-        final boolean nonRecursiveEnabled = isButtonEnabled(false, e.getPaths(), e);
+        final boolean nonRecursiveEnabled = isButtonEnabled(false);
         include.setEnabled(nonRecursiveEnabled);
         exclude.setEnabled(nonRecursiveEnabled);
       }
@@ -281,19 +282,6 @@ public class ScopeEditorPanel {
     return buttonsPanel;
   }
 
-  static boolean isButtonEnabled(boolean rec, TreePath[] paths, TreeSelectionEvent e) {
-    if (paths != null) {
-      for (TreePath path : paths) {
-        if (!e.isAddedPath(path)) continue;
-        final PackageDependenciesNode node = (PackageDependenciesNode)path.getLastPathComponent();
-        if (PatternDialectProvider.getInstance(DependencyUISettings.getInstance().SCOPE_TYPE).createPackageSet(node, rec) != null) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
   boolean isButtonEnabled(boolean rec) {
     final TreePath[] paths = myPackageTree.getSelectionPaths();
     if (paths != null) {
diff --git a/platform/script-debugger/debugger-ui/src/org/jetbrains/debugger/DebuggerSupportUtils.java b/platform/script-debugger/debugger-ui/src/org/jetbrains/debugger/DebuggerSupportUtils.java
new file mode 100644 (file)
index 0000000..3f25196
--- /dev/null
@@ -0,0 +1,21 @@
+package org.jetbrains.debugger;
+
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.xdebugger.XDebuggerUtil;
+import com.intellij.xdebugger.XSourcePosition;
+import org.jetbrains.annotations.Nullable;
+
+public final class DebuggerSupportUtils {
+  @Nullable
+  public static XSourcePosition calcSourcePosition(@Nullable PsiElement element) {
+    if (element != null) {
+      PsiElement navigationElement = element.getNavigationElement();
+      VirtualFile file = navigationElement.getContainingFile().getVirtualFile();
+      if (file != null) {
+        return XDebuggerUtil.getInstance().createPositionByOffset(file, navigationElement.getTextOffset());
+      }
+    }
+    return null;
+  }
+}
index d734d4b4faa7b1e2326336f1fc518e56e5b970db..20e41ed39aad779753660f4b1511e2ca4208f71e 100644 (file)
@@ -56,7 +56,7 @@ public class FileSystemUtil {
     @Nullable
     protected abstract String resolveSymLink(@NotNull String path) throws Exception;
 
-    protected boolean clonePermissions(@NotNull String source, @NotNull String target) throws Exception { return false; }
+    protected boolean clonePermissions(@NotNull String source, @NotNull String target, boolean onlyPermissionsToExecute) throws Exception { return false; }
 
     @NotNull
     private String getName() { return getClass().getSimpleName().replace("MediatorImpl", ""); }
@@ -196,7 +196,21 @@ public class FileSystemUtil {
    */
   public static boolean clonePermissions(@NotNull String source, @NotNull String target) {
     try {
-      return ourMediator.clonePermissions(source, target);
+      return ourMediator.clonePermissions(source, target, false);
+    }
+    catch (Exception e) {
+      LOG.warn(e);
+      return false;
+    }
+  }
+
+  /**
+   * Gives the second file permissions to execute of the first one if possible; returns true if succeed.
+   * Will do nothing on Windows.
+   */
+  public static boolean clonePermissionsToExecute(@NotNull String source, @NotNull String target) {
+    try {
+      return ourMediator.clonePermissions(source, target, true);
     }
     catch (Exception e) {
       LOG.warn(e);
@@ -303,21 +317,44 @@ public class FileSystemUtil {
     }
 
     @Override
-    protected boolean clonePermissions(@NotNull String source, @NotNull String target) throws Exception {
+    protected boolean clonePermissions(@NotNull String source, @NotNull String target, boolean onlyPermissionsToExecute) throws Exception {
       if (SystemInfo.isUnix) {
-        Object pathObj = myGetPath.invoke(myDefaultFileSystem, source, ArrayUtil.EMPTY_STRING_ARRAY);
-        Map attributes = (Map)myReadAttributes.invoke(null, pathObj, "posix:permissions", myLinkOptions);
-        if (attributes != null) {
-          Object permissions = attributes.get("permissions");
-          if (permissions instanceof Collection) {
-            mySetAttribute.invoke(null, pathObj, "posix:permissions", permissions, myLinkOptions);
-            return true;
+        Object sourcePath = myGetPath.invoke(myDefaultFileSystem, source, ArrayUtil.EMPTY_STRING_ARRAY);
+        Object targetPath = myGetPath.invoke(myDefaultFileSystem, target, ArrayUtil.EMPTY_STRING_ARRAY);
+        Collection sourcePermissions = getPermissions(sourcePath);
+        if (sourcePermissions != null) {
+          Collection permissionsToSet;
+          if (onlyPermissionsToExecute) {
+            Collection targetPermissions = getPermissions(targetPath);
+            permissionsToSet = new HashSet();
+            for (Object permission : targetPermissions) {
+              if (!permission.toString().endsWith("_EXECUTE")) {
+                permissionsToSet.add(permission);
+              }
+            }
+            for (Object permission : sourcePermissions) {
+              if (permission.toString().endsWith("_EXECUTE")) {
+                permissionsToSet.add(permission);
+              }
+            }
+          }
+          else {
+            permissionsToSet = sourcePermissions;
           }
+          mySetAttribute.invoke(null, targetPath, "posix:permissions", permissionsToSet, myLinkOptions);
+          return true;
         }
       }
 
       return false;
     }
+
+    private Collection getPermissions(Object sourcePath) throws IllegalAccessException, InvocationTargetException {
+      Map attributes = (Map)myReadAttributes.invoke(null, sourcePath, "posix:permissions", myLinkOptions);
+      if (attributes == null) return null;
+      Object permissions = attributes.get("permissions");
+      return permissions instanceof Collection<?> ? (Collection)permissions : null;
+    }
   }
 
 
@@ -346,6 +383,7 @@ public class FileSystemUtil {
       int S_IFREG = 0100000;  // regular file
       int S_IFDIR = 0040000;  // directory
       int PERM_MASK = 0777;
+      int EXECUTE_MASK = 0111;
       int WRITE_MASK = 0222;
       int W_OK = 2;           // write permission flag for access(2)
 
@@ -396,14 +434,13 @@ public class FileSystemUtil {
       int res = SystemInfo.isLinux ? myLibC.__lxstat64(0, path, buffer) : myLibC.lstat(path, buffer);
       if (res != 0) return null;
 
-      int mode = (SystemInfo.isLinux ? buffer.getInt(myOffsets[OFF_MODE]) : buffer.getShort(myOffsets[OFF_MODE])) & LibC.S_MASK;
+      int mode = getModeFlags(buffer) & LibC.S_MASK;
       boolean isSymlink = (mode & LibC.S_IFLNK) == LibC.S_IFLNK;
       if (isSymlink) {
-        res = SystemInfo.isLinux ? myLibC.__xstat64(0, path, buffer) : myLibC.stat(path, buffer);
-        if (res != 0) {
+        if (!loadFileStatus(path, buffer)) {
           return FileAttributes.BROKEN_SYMLINK;
         }
-        mode = (SystemInfo.isLinux ? buffer.getInt(myOffsets[OFF_MODE]) : buffer.getShort(myOffsets[OFF_MODE])) & LibC.S_MASK;
+        mode = getModeFlags(buffer) & LibC.S_MASK;
       }
 
       boolean isDirectory = (mode & LibC.S_IFDIR) == LibC.S_IFDIR;
@@ -418,6 +455,10 @@ public class FileSystemUtil {
       return new FileAttributes(isDirectory, isSpecial, isSymlink, false, size, mTime, writable);
     }
 
+    private boolean loadFileStatus(@NotNull String path, Memory buffer) {
+      return (SystemInfo.isLinux ? myLibC.__xstat64(0, path, buffer) : myLibC.stat(path, buffer)) == 0;
+    }
+
     @Override
     protected String resolveSymLink(@NotNull final String path) throws Exception {
       try {
@@ -434,15 +475,25 @@ public class FileSystemUtil {
     }
 
     @Override
-    protected boolean clonePermissions(@NotNull String source, @NotNull String target) throws Exception {
+    protected boolean clonePermissions(@NotNull String source, @NotNull String target, boolean onlyPermissionsToExecute) throws Exception {
       Memory buffer = new Memory(256);
-      int res = SystemInfo.isLinux ? myLibC.__xstat64(0, source, buffer) : myLibC.stat(source, buffer);
-      if (res == 0) {
-        int permissions = (SystemInfo.isLinux ? buffer.getInt(myOffsets[OFF_MODE]) : buffer.getShort(myOffsets[OFF_MODE])) & LibC.PERM_MASK;
-        return myLibC.chmod(target, permissions) == 0;
+      if (!loadFileStatus(source, buffer)) return false;
+
+      int permissions;
+      int sourcePermissions = getModeFlags(buffer) & LibC.PERM_MASK;
+      if (onlyPermissionsToExecute) {
+        if (!loadFileStatus(target, buffer)) return false;
+        int targetPermissions = getModeFlags(buffer) & LibC.PERM_MASK;
+        permissions = targetPermissions & ~LibC.EXECUTE_MASK | sourcePermissions & LibC.EXECUTE_MASK;
       }
+      else {
+        permissions = sourcePermissions;
+      }
+      return myLibC.chmod(target, permissions) == 0;
+    }
 
-      return false;
+    private int getModeFlags(Memory buffer) {
+      return SystemInfo.isLinux ? buffer.getInt(myOffsets[OFF_MODE]) : buffer.getShort(myOffsets[OFF_MODE]);
     }
 
     private boolean ownFile(Memory buffer) {
@@ -509,11 +560,14 @@ public class FileSystemUtil {
     }
 
     @Override
-    protected boolean clonePermissions(@NotNull String source, @NotNull String target) throws Exception {
+    protected boolean clonePermissions(@NotNull String source, @NotNull String target, boolean onlyPermissionsToExecute) throws Exception {
       if (SystemInfo.isUnix) {
         File srcFile = new File(source);
         File dstFile = new File(target);
-        return dstFile.setWritable(srcFile.canWrite(), true) && dstFile.setExecutable(srcFile.canExecute(), true);
+        if (!onlyPermissionsToExecute) {
+          if (!dstFile.setWritable(srcFile.canWrite(), true)) return false;
+        }
+        return dstFile.setExecutable(srcFile.canExecute(), true);
       }
 
       return false;
index a747727cfbc38cfe6cceceff81273c79ed5d978d..419c1bbfe14c30f95cb371fd6db1a82f2e75ec41 100644 (file)
@@ -497,7 +497,7 @@ public class FileUtil extends FileUtilRt {
     }
 
     if (SystemInfo.isUnix && fromFile.canExecute()) {
-      FileSystemUtil.clonePermissions(fromFile.getPath(), toFile.getPath());
+      FileSystemUtil.clonePermissionsToExecute(fromFile.getPath(), toFile.getPath());
     }
   }
 
index 8ee6f46b10930ebb91f3b0c1762ade06efc12dcf..fdcc4f876b3f7a26d0937dc785f676427fcf3a88 100644 (file)
@@ -156,6 +156,7 @@ public class Restarter {
   public static File createTempExecutable(File executable) throws IOException {
     File executableDir = new File(System.getProperty("user.home") + "/." + System.getProperty("idea.paths.selector") + "/restart");
     File copy = new File(executableDir.getPath() + "/" + executable.getName());
+    if (!FileUtilRt.createDirectory(executableDir)) throw new IOException("Cannot create dir: " + executableDir);
     if (!FileUtilRt.ensureCanCreateFile(copy) || (copy.exists() && !copy.delete())) {
        String ext = FileUtilRt.getExtension(executable.getName());
        copy = FileUtilRt.createTempFile(executableDir, FileUtilRt.getNameWithoutExtension(copy.getName()),
index 8e51cefab29a8aba801b81f982d5bb9b282b9267..c8c81f08882cd843afa4ada4c04025914a6b4919 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2015 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.
@@ -275,6 +275,11 @@ public class XDebuggerUtilImpl extends XDebuggerUtil {
 
     PsiElement element;
     int offset = lineStart;
+
+    if (file instanceof PsiCompiledFile) {
+      file = ((PsiCompiledFile)file).getDecompiledPsiFile();
+    }
+
     while (offset < lineEnd) {
       element = file.findElementAt(offset);
       if (element != null) {