2 * Copyright 2000-2009 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 package com
.intellij
.psi
.search
.scope
.packageSet
;
23 import com
.intellij
.analysis
.AnalysisScopeBundle
;
24 import com
.intellij
.lexer
.Lexer
;
25 import com
.intellij
.psi
.search
.scope
.packageSet
.lexer
.ScopeTokenTypes
;
27 public class PatternPackageSetParserExtension
implements PackageSetParserExtension
{
29 public PackageSet
parsePackageSet(final Lexer lexer
, final String scope
, final String modulePattern
) throws ParsingException
{
30 if (scope
== PatternPackageSet
.SCOPE_ANY
&& modulePattern
== null) {
31 error(AnalysisScopeBundle
.message("error.packageset.common.expectations"), lexer
);
33 if (scope
!= PatternPackageSet
.SCOPE_ANY
&&
34 scope
!= PatternPackageSet
.SCOPE_LIBRARY
&&
35 scope
!= PatternPackageSet
.SCOPE_PROBLEM
&&
36 scope
!= PatternPackageSet
.SCOPE_SOURCE
&&
37 scope
!= PatternPackageSet
.SCOPE_TEST
) {
40 return new PatternPackageSet(parseAspectJPattern(lexer
), scope
, modulePattern
);
43 public String
parseScope(final Lexer lexer
) {
44 if (lexer
.getTokenType() != ScopeTokenTypes
.IDENTIFIER
) return PatternPackageSet
.SCOPE_ANY
;
45 String id
= getTokenText(lexer
);
46 String scope
= PatternPackageSet
.SCOPE_ANY
;
47 if (PatternPackageSet
.SCOPE_SOURCE
.equals(id
)) {
48 scope
= PatternPackageSet
.SCOPE_SOURCE
;
49 } else if (PatternPackageSet
.SCOPE_TEST
.equals(id
)) {
50 scope
= PatternPackageSet
.SCOPE_TEST
;
51 } else if (PatternPackageSet
.SCOPE_PROBLEM
.equals(id
)) {
52 scope
= PatternPackageSet
.SCOPE_PROBLEM
;
53 } else if (PatternPackageSet
.SCOPE_LIBRARY
.equals(id
)) {
54 scope
= PatternPackageSet
.SCOPE_LIBRARY
;
55 } else if (id
.trim().length() > 0) {
58 final CharSequence buf
= lexer
.getBufferSequence();
59 int end
= lexer
.getTokenEnd();
60 int bufferEnd
= lexer
.getBufferEnd();
62 if (scope
== PatternPackageSet
.SCOPE_ANY
|| end
>= bufferEnd
|| buf
.charAt(end
) != ':' && buf
.charAt(end
) != '[') {
63 return PatternPackageSet
.SCOPE_ANY
;
73 private static String
parseAspectJPattern(Lexer lexer
) throws ParsingException
{
74 StringBuffer pattern
= new StringBuffer();
75 boolean wasIdentifier
= false;
77 if (lexer
.getTokenType() == ScopeTokenTypes
.DOT
) {
79 wasIdentifier
= false;
81 else if (lexer
.getTokenType() == ScopeTokenTypes
.ASTERISK
) {
83 wasIdentifier
= false;
85 else if (lexer
.getTokenType() == ScopeTokenTypes
.IDENTIFIER
) {
86 if (wasIdentifier
) error(AnalysisScopeBundle
.message("error.packageset.token.expectations", getTokenText(lexer
)), lexer
);
88 pattern
.append(getTokenText(lexer
));
96 if (pattern
.length() == 0) {
97 error(AnalysisScopeBundle
.message("error.packageset.pattern.expectations"), lexer
);
100 return pattern
.toString();
104 private static String
getTokenText(Lexer lexer
) {
105 int start
= lexer
.getTokenStart();
106 int end
= lexer
.getTokenEnd();
107 return lexer
.getBufferSequence().subSequence(start
, end
).toString();
110 private static void error(String message
, Lexer lexer
) throws ParsingException
{
111 throw new ParsingException(
112 AnalysisScopeBundle
.message("error.packageset.position.parsing.error", message
, (lexer
.getTokenStart() + 1)));