create java project from sources: fix package name detection

Package statement in package-info.java file may have annotations which should be ignored (IDEA-180764).
This commit is contained in:
nik
2017-11-02 11:32:39 +03:00
parent efbe659935
commit 37b9dd0b49
4 changed files with 123 additions and 1 deletions
@@ -70,9 +70,10 @@ public class JavaSourceRootDetectionUtil {
@Nullable
public static String getPackageName(CharSequence text) {
Lexer lexer = JavaParserDefinition.createLexer(LanguageLevel.JDK_1_3);
Lexer lexer = JavaParserDefinition.createLexer(LanguageLevel.JDK_1_5);
lexer.start(text);
skipWhiteSpaceAndComments(lexer);
skipAnnotations(lexer);
final IElementType firstToken = lexer.getTokenType();
if (firstToken != JavaTokenType.PACKAGE_KEYWORD) {
if (JAVA_FILE_FIRST_TOKEN_SET.contains(firstToken)) {
@@ -104,4 +105,54 @@ public class JavaSourceRootDetectionUtil {
lexer.advance();
}
}
private static void skipAnnotations(Lexer lexer){
while (lexer.getTokenType() == JavaTokenType.AT) {
lexer.advance();
skipQualifiedIdentifier(lexer);
skipArguments(lexer);
skipWhiteSpaceAndComments(lexer);
}
}
private static void skipQualifiedIdentifier(Lexer lexer) {
if (lexer.getTokenType() == JavaTokenType.IDENTIFIER) {
lexer.advance();
skipWhiteSpaceAndComments(lexer);
while (lexer.getTokenType() == JavaTokenType.DOT) {
lexer.advance();
skipWhiteSpaceAndComments(lexer);
if (lexer.getTokenType() != JavaTokenType.IDENTIFIER) {
break;
}
lexer.advance();
skipWhiteSpaceAndComments(lexer);
}
skipWhiteSpaceAndComments(lexer);
}
}
private static void skipArguments(Lexer lexer) {
skipWhiteSpaceAndComments(lexer);
if (lexer.getTokenType() == JavaTokenType.LPARENTH) {
lexer.advance();
int depth = 1;
while (depth > 0) {
IElementType tokenType = lexer.getTokenType();
if (tokenType == JavaTokenType.LPARENTH) {
depth++;
}
else if (tokenType == JavaTokenType.RPARENTH) {
depth--;
}
else {
if (tokenType == null) {
break;
}
}
lexer.advance();
}
skipWhiteSpaceAndComments(lexer);
}
}
}
@@ -0,0 +1,65 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.util.projectWizard.importSources;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* @author nik
*/
public class JavaSourceRootDetectionUtilTest {
@Test
public void simple() {
assertPackageDetected("package p; \n" +
"class A {}", "p");
assertPackageDetected("package p; \n" +
"import java.util.Set;" +
"class A {}", "p");
assertPackageDetected("class A {}", "");
assertPackageDetected("import java.util.*;\n" +
"class A {}", "");
assertPackageDetected("invalid", null);
}
@Test
public void comments() {
assertPackageDetected("/* aa */ package p;", "p");
assertPackageDetected("// aa\n" +
"package p;", "p");
assertPackageDetected("/* a */ /* b */ package p;", "p");
assertPackageDetected("package /* a */ p;", "p");
assertPackageDetected("package p /* a */;", "p");
}
@Test
public void qualified() {
assertPackageDetected("package p.q;", "p.q");
assertPackageDetected("package p . q;", "p.q");
assertPackageDetected("package /* xxx */ p . q;", "p.q");
assertPackageDetected("package p . /* xxx */ q;", "p.q");
}
@Test
public void validPackageAnnotation() {
assertPackageDetected("@Deprecated package p.q;", "p.q");
assertPackageDetected("@java.lang.Deprecated package p.q;", "p.q");
assertPackageDetected("@Generated(\"text\") package p.q;", "p.q");
assertPackageDetected("@Generated( (\"text\") ) package p.q;", "p.q");
assertPackageDetected("@Generated((\"text\"), (\"text\")) package p.q;", "p.q");
assertPackageDetected("@Generated(\"text\")\n" +
"@Deprecated\n" +
"package p.q;", "p.q");
assertPackageDetected("@Deprecated/*aa*/ package p.q;", "p.q");
}
@Test
public void invalidPackageAnnotation() {
assertPackageDetected("@Deprecatedpackage p.q;", null);
assertPackageDetected("@javax.annotation.Generated(\"text\" package p.q;", null);
}
private static void assertPackageDetected(String text, String packageName) {
assertEquals(packageName, JavaSourceRootDetectionUtil.getPackageName(text));
}
}
@@ -0,0 +1,2 @@
@Deprecated
package pack;
@@ -58,6 +58,10 @@ public class JavaSourceRootDetectionTest extends PlatformTestCase {
doTest("src", "");
}
public void testPackageWithAnnotation() {
doTest("src", "");
}
private void doTest(String... expected) {
final String dirPath = JavaTestUtil.getJavaTestDataPath() + FileUtil.toSystemDependentName("/ide/sourceRootDetection/" + getTestName(true));
final File dir = new File(dirPath);