IDEA-251030 Icons are not shown in Database toolwindow popup menu
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / GroovySourceRootDetector.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.jetbrains.plugins.groovy;
17
18 import com.intellij.ide.util.projectWizard.importSources.JavaSourceRootDetector;
19 import com.intellij.lexer.Lexer;
20 import com.intellij.openapi.util.text.StringUtil;
21 import com.intellij.psi.tree.IElementType;
22 import com.intellij.util.NullableFunction;
23 import org.jetbrains.annotations.Nls;
24 import org.jetbrains.annotations.NotNull;
25 import org.jetbrains.annotations.Nullable;
26 import org.jetbrains.plugins.groovy.lang.lexer.GroovyLexer;
27 import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
28 import org.jetbrains.plugins.groovy.lang.lexer.TokenSets;
29
30 public class GroovySourceRootDetector extends JavaSourceRootDetector {
31   @NotNull
32   @Override
33   protected @Nls(capitalization = Nls.Capitalization.Sentence) String getLanguageName() {
34     return GroovyBundle.message("file.template.group.title.groovy");
35   }
36
37   @NotNull
38   @Override
39   protected String getFileExtension() {
40     return GroovyFileType.DEFAULT_EXTENSION;
41   }
42
43   @Override
44   @NotNull
45   protected NullableFunction<CharSequence, String> getPackageNameFetcher() {
46     return charSequence -> getPackageName(charSequence);
47   }
48
49   @Nullable
50   public static String getPackageName(CharSequence text) {
51     Lexer lexer = new GroovyLexer();
52     lexer.start(text);
53     skipWhitespacesAndComments(lexer);
54     final IElementType firstToken = lexer.getTokenType();
55     if (firstToken != GroovyTokenTypes.kPACKAGE) {
56       return "";
57     }
58     lexer.advance();
59     skipWhitespacesAndComments(lexer);
60
61     final StringBuilder buffer = new StringBuilder();
62     while(true){
63       if (lexer.getTokenType() != GroovyTokenTypes.mIDENT) break;
64       buffer.append(text, lexer.getTokenStart(), lexer.getTokenEnd());
65       lexer.advance();
66       skipWhitespacesAndComments(lexer);
67       if (lexer.getTokenType() != GroovyTokenTypes.mDOT) break;
68       buffer.append('.');
69       lexer.advance();
70       skipWhitespacesAndComments(lexer);
71     }
72     String packageName = buffer.toString();
73     if (packageName.isEmpty() || StringUtil.endsWithChar(packageName, '.')) return null;
74     return packageName;
75   }
76
77   private static void skipWhitespacesAndComments(Lexer lexer) {
78     while(TokenSets.ALL_COMMENT_TOKENS.contains(lexer.getTokenType()) || TokenSets.WHITE_SPACES_SET.contains(lexer.getTokenType())) {
79       lexer.advance();
80     }
81   }
82 }