mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+52
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+65
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user