1
1
/*
2
- * Copyright 2002-2018 the original author or authors.
2
+ * Copyright 2002-2019 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -54,6 +54,9 @@ private static Profiles parseExpression(String expression) {
54
54
}
55
55
56
56
private static Profiles parseTokens (String expression , StringTokenizer tokens ) {
57
+ return parseTokens (expression , tokens , Context .NONE );
58
+ }
59
+ private static Profiles parseTokens (String expression , StringTokenizer tokens , Context context ) {
57
60
List <Profiles > elements = new ArrayList <>();
58
61
Operator operator = null ;
59
62
while (tokens .hasMoreTokens ()) {
@@ -63,7 +66,11 @@ private static Profiles parseTokens(String expression, StringTokenizer tokens) {
63
66
}
64
67
switch (token ) {
65
68
case "(" :
66
- elements .add (parseTokens (expression , tokens ));
69
+ Profiles contents = parseTokens (expression , tokens , Context .BRACKET );
70
+ if (context == Context .INVERT ) {
71
+ return contents ;
72
+ }
73
+ elements .add (contents );
67
74
break ;
68
75
case "&" :
69
76
assertWellFormed (expression , operator == null || operator == Operator .AND );
@@ -74,16 +81,23 @@ private static Profiles parseTokens(String expression, StringTokenizer tokens) {
74
81
operator = Operator .OR ;
75
82
break ;
76
83
case "!" :
77
- elements .add (not (parseTokens (expression , tokens )));
84
+ elements .add (not (parseTokens (expression , tokens , Context . INVERT )));
78
85
break ;
79
86
case ")" :
80
87
Profiles merged = merge (expression , elements , operator );
88
+ if (context == Context .BRACKET ) {
89
+ return merged ;
90
+ }
81
91
elements .clear ();
82
92
elements .add (merged );
83
93
operator = null ;
84
94
break ;
85
95
default :
86
- elements .add (equals (token ));
96
+ Profiles value = equals (token );
97
+ if (context == Context .INVERT ) {
98
+ return value ;
99
+ }
100
+ elements .add (value );
87
101
}
88
102
}
89
103
return merge (expression , elements , operator );
@@ -126,6 +140,9 @@ private static Predicate<Profiles> isMatch(Predicate<String> activeProfile) {
126
140
private enum Operator {AND , OR }
127
141
128
142
143
+ private enum Context {NONE , INVERT , BRACKET }
144
+
145
+
129
146
private static class ParsedProfiles implements Profiles {
130
147
131
148
private final String [] expressions ;
0 commit comments