Skip to content

Commit fc8725b

Browse files
authored
Merge pull request #7 from QuickWrite/fix/term-bug
fix/term bug
2 parents 18f5dcd + 19747da commit fc8725b

File tree

5 files changed

+113
-102
lines changed

5 files changed

+113
-102
lines changed

src/main/java/net/quickwrite/fluent4j/ast/placeable/AttributeReference.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,19 @@ public CharSequence getResult(final DirectFluentBundle bundle, final FluentArgs
5353
return getErrorString();
5454
}
5555

56-
return attribute.getResult(bundle, arguments);
56+
return attribute.getResult(bundle, getArguments(arguments));
5757
}
5858

5959
@Override
6060
public FluentElement getArgumentResult(final DirectFluentBundle bundle, final FluentArgs arguments) {
61-
final FluentAttribute attribute = this.getMessage(bundle, reference.stringValue())
62-
.getAttribute(this.attributeIdentifier);
63-
if (attribute == null) {
61+
final FluentMessage fluentMessage = this.getMessage(bundle, reference.stringValue());
62+
if (fluentMessage == null) {
63+
return this;
64+
}
65+
66+
final FluentAttribute attribute = fluentMessage.getAttribute(this.attributeIdentifier);
67+
68+
if(attribute == null) {
6469
return this;
6570
}
6671

@@ -71,7 +76,7 @@ public FluentElement getArgumentResult(final DirectFluentBundle bundle, final Fl
7176
}
7277

7378
// No recursion (unfortunately :d)
74-
return (FluentElement) elementList.get(0);
79+
return elementList.get(0);
7580
}
7681

7782
protected FluentMessage getMessage(final DirectFluentBundle bundle, final String key) {
@@ -82,6 +87,10 @@ protected String getErrorString() {
8287
return "{" + reference.stringValue() + "." + attributeIdentifier + "}";
8388
}
8489

90+
protected FluentArgs getArguments(final FluentArgs defaultArgs) {
91+
return defaultArgs;
92+
}
93+
8594
@Override
8695
public String toString() {
8796
return "FluentAttributeReference: {\n" +
@@ -91,8 +100,12 @@ public String toString() {
91100
}
92101

93102
public static class TermAttributeReference extends AttributeReference implements FluentSelectable {
94-
public TermAttributeReference(FluentPlaceable reference, StringSlice content) {
103+
private final FluentArgs arguments;
104+
105+
public TermAttributeReference(final FluentPlaceable reference, final StringSlice content, final FluentArgs arguments) {
95106
super(reference, content);
107+
108+
this.arguments = arguments;
96109
}
97110

98111
@Override
@@ -104,5 +117,19 @@ protected FluentMessage getMessage(final DirectFluentBundle bundle, final String
104117
protected String getErrorString() {
105118
return "{-" + reference.stringValue() + "." + attributeIdentifier + "}";
106119
}
120+
121+
@Override
122+
protected FluentArgs getArguments(final FluentArgs defaultArgs) {
123+
return this.arguments;
124+
}
125+
126+
@Override
127+
public String toString() {
128+
return "FluentTermAttributeReference: {\n" +
129+
"\t\t\tvalue: \"" + this.reference + "\"\n" +
130+
"\t\t\tattribute: \"" + this.attributeIdentifier + "\"\n" +
131+
"\t\t\targuments: \"" + this.arguments + "\"\n" +
132+
"\t\t}";
133+
}
107134
}
108135
}

src/main/java/net/quickwrite/fluent4j/ast/placeable/FunctionReference.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
*/
1717
public class FunctionReference extends FluentFunction implements FluentSelectable {
1818

19-
public FunctionReference(final String functionName, final StringSlice content) {
20-
super(functionName, content);
19+
public FunctionReference(final String functionName, final FluentArgs arguments) {
20+
super(functionName, arguments);
2121
}
2222

2323
@Override

src/main/java/net/quickwrite/fluent4j/ast/placeable/TermReference.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import net.quickwrite.fluent4j.ast.placeable.base.FluentFunction;
66
import net.quickwrite.fluent4j.util.StringSlice;
77
import net.quickwrite.fluent4j.util.args.FluentArgs;
8-
import net.quickwrite.fluent4j.util.args.FluentArguments;
98
import net.quickwrite.fluent4j.util.bundle.DirectFluentBundle;
109

1110
/**
@@ -30,8 +29,8 @@ public TermReference(final StringSlice name) {
3029
super(name, null);
3130
}
3231

33-
public TermReference(final String name, final StringSlice content) {
34-
super(name, content);
32+
public TermReference(final String name, final FluentArgs arguments) {
33+
super(name, arguments);
3534
}
3635

3736
@Override
@@ -60,11 +59,6 @@ public FluentElement getArgumentResult(final DirectFluentBundle bundle, final Fl
6059
return term;
6160
}
6261

63-
@Override
64-
protected FluentArgs getFluentArgumentInstance() {
65-
return new FluentArguments();
66-
}
67-
6862
@Override
6963
public String toString() {
7064
return "FluentTermReference: {\n" +

src/main/java/net/quickwrite/fluent4j/ast/placeable/base/FluentFunction.java

Lines changed: 7 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@
33
import net.quickwrite.fluent4j.ast.FluentElement;
44
import net.quickwrite.fluent4j.exception.FluentParseException;
55
import net.quickwrite.fluent4j.util.StringSlice;
6-
import net.quickwrite.fluent4j.util.StringSliceUtil;
76
import net.quickwrite.fluent4j.util.args.FluentArgs;
8-
import net.quickwrite.fluent4j.util.args.FunctionFluentArgs;
97
import net.quickwrite.fluent4j.util.args.FunctionFluentArguments;
108
import net.quickwrite.fluent4j.util.bundle.DirectFluentBundle;
11-
import org.apache.commons.lang3.tuple.ImmutablePair;
12-
import org.apache.commons.lang3.tuple.Pair;
139

1410
/**
1511
* Implements the basis for a value that gets
@@ -20,68 +16,18 @@ public abstract class FluentFunction implements FluentPlaceable, FluentArgumentR
2016
protected final String functionName;
2117
protected final FluentArgs arguments;
2218

23-
public FluentFunction(final StringSlice functionName, final StringSlice content) {
24-
this(functionName.toString(), content);
19+
public FluentFunction(final StringSlice functionName, final FluentArgs arguments) {
20+
this(functionName.toString(), arguments);
2521
}
2622

27-
public FluentFunction(final String functionName, final StringSlice content) {
23+
public FluentFunction(final String functionName, final FluentArgs arguments) {
2824
this.functionName = functionName;
2925
if (!check(functionName)) {
3026
// TODO: Better Error handling
3127
throw new FluentParseException("The callee has to be an upper-case identifier or a term");
3228
}
3329

34-
this.arguments = (content == null) ? FunctionFluentArgs.EMPTY_ARGS : this.getArguments(content);
35-
}
36-
37-
private FluentArgs getArguments(final StringSlice content) {
38-
StringSliceUtil.skipWhitespaceAndNL(content);
39-
if (content.isBigger()) {
40-
return FunctionFluentArgs.EMPTY_ARGS;
41-
}
42-
43-
final FunctionFluentArgs arguments = (FunctionFluentArgs) this.getFluentArgumentInstance();
44-
45-
while (!content.isBigger()) {
46-
Pair<String, FluentElement> argument = getArgument(content);
47-
if (argument.getLeft() != null) {
48-
arguments.setNamed(argument.getLeft(), argument.getRight());
49-
} else {
50-
arguments.addPositional(argument.getRight());
51-
}
52-
53-
StringSliceUtil.skipWhitespaceAndNL(content);
54-
55-
if (content.getChar() != ',') {
56-
if (!content.isBigger()) {
57-
throw new FluentParseException("','", content.getCharUTF16(), content.getAbsolutePosition());
58-
}
59-
break;
60-
}
61-
content.increment();
62-
63-
StringSliceUtil.skipWhitespaceAndNL(content);
64-
}
65-
66-
return arguments;
67-
}
68-
69-
private Pair<String, FluentElement> getArgument(final StringSlice content) {
70-
FluentPlaceable placeable = StringSliceUtil.getExpression(content);
71-
String identifier = null;
72-
73-
StringSliceUtil.skipWhitespaceAndNL(content);
74-
75-
if (content.getChar() == ':') {
76-
content.increment();
77-
StringSliceUtil.skipWhitespaceAndNL(content);
78-
79-
identifier = placeable.stringValue();
80-
81-
placeable = StringSliceUtil.getExpression(content);
82-
}
83-
84-
return new ImmutablePair<>(identifier, placeable);
30+
this.arguments = arguments;
8531
}
8632

8733
/**
@@ -93,12 +39,10 @@ private Pair<String, FluentElement> getArgument(final StringSlice content) {
9339
* @return The sanitized arguments of the function
9440
*/
9541
protected FluentArgs getArguments(final DirectFluentBundle bundle, final FluentArgs arguments) {
96-
this.arguments.sanitize(bundle, arguments);
97-
return this.arguments;
98-
}
42+
if (this.arguments != null)
43+
this.arguments.sanitize(bundle, arguments);
9944

100-
protected FluentArgs getFluentArgumentInstance() {
101-
return new FunctionFluentArguments();
45+
return this.arguments;
10246
}
10347

10448
/**

src/main/java/net/quickwrite/fluent4j/util/StringSliceUtil.java

Lines changed: 69 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package net.quickwrite.fluent4j.util;
22

3+
import net.quickwrite.fluent4j.ast.FluentElement;
34
import net.quickwrite.fluent4j.ast.placeable.*;
45
import net.quickwrite.fluent4j.ast.placeable.base.FluentPlaceable;
56
import net.quickwrite.fluent4j.exception.FluentParseException;
7+
import net.quickwrite.fluent4j.util.args.FluentArgs;
8+
import net.quickwrite.fluent4j.util.args.FunctionFluentArgs;
9+
import net.quickwrite.fluent4j.util.args.FunctionFluentArguments;
10+
import org.apache.commons.lang3.tuple.ImmutablePair;
11+
import org.apache.commons.lang3.tuple.Pair;
612

713
/**
814
* A collection of different utility methods
@@ -180,34 +186,14 @@ private static FluentPlaceable expressionGetDefault(final StringSlice slice) {
180186
private static FluentPlaceable expressionGetFunction(final StringSlice slice, FluentPlaceable expression, final boolean isTerm) {
181187
slice.increment();
182188

183-
int start = slice.getPosition();
184-
185-
int open = 0;
186-
187-
while (!(slice.getChar() == ')' && open == 0)) {
188-
if (slice.isBigger()) {
189-
throw new FluentParseException(")", "EOF", slice.getAbsolutePosition());
190-
}
191-
192-
if (slice.getChar() == '(') {
193-
open++;
194-
}
195-
196-
if (slice.getChar() == ')') {
197-
open--;
198-
}
199-
200-
slice.increment();
201-
}
202-
203189
expression = (!isTerm) ?
204190
new FunctionReference(
205191
expression.stringValue(),
206-
slice.substring(start, slice.getPosition())
192+
parseArguments(slice)
207193
) :
208194
new TermReference(
209195
expression.stringValue(),
210-
slice.substring(start, slice.getPosition())
196+
parseArguments(slice)
211197
);
212198

213199
slice.increment();
@@ -220,14 +206,74 @@ private static FluentPlaceable expressionGetAttribute(final StringSlice slice, F
220206
final StringSlice identifier = StringSliceUtil.getIdentifier(slice);
221207

222208
if (isTerm) {
223-
expression = new AttributeReference.TermAttributeReference(expression, identifier);
209+
skipWhitespaceAndNL(slice);
210+
FluentArgs arguments = null;
211+
212+
if (slice.getChar() == '(') {
213+
slice.increment();
214+
arguments = parseArguments(slice);
215+
slice.increment();
216+
}
217+
expression = new AttributeReference.TermAttributeReference(expression, identifier, arguments);
224218
} else {
225219
expression = new AttributeReference(expression, identifier);
226220
}
227221

228222
return expression;
229223
}
230224

225+
private static FluentArgs parseArguments(final StringSlice content) {
226+
if (content == null) {
227+
return FluentArgs.EMPTY_ARGS;
228+
}
229+
230+
StringSliceUtil.skipWhitespaceAndNL(content);
231+
if (content.isBigger()) {
232+
return FunctionFluentArgs.EMPTY_ARGS;
233+
}
234+
235+
final FunctionFluentArgs arguments = new FunctionFluentArguments();
236+
237+
while (!content.isBigger() && content.getChar() != ')') {
238+
Pair<String, FluentElement> argument = getArgument(content);
239+
240+
if (argument.getLeft() != null) {
241+
arguments.setNamed(argument.getLeft(), argument.getRight());
242+
} else {
243+
arguments.addPositional(argument.getRight());
244+
}
245+
246+
StringSliceUtil.skipWhitespaceAndNL(content);
247+
248+
if (content.getChar() != ',') {
249+
break;
250+
}
251+
content.increment();
252+
253+
StringSliceUtil.skipWhitespaceAndNL(content);
254+
}
255+
256+
return arguments;
257+
}
258+
259+
private static Pair<String, FluentElement> getArgument(final StringSlice content) {
260+
FluentPlaceable placeable = StringSliceUtil.getExpression(content);
261+
String identifier = null;
262+
263+
StringSliceUtil.skipWhitespaceAndNL(content);
264+
265+
if (content.getChar() == ':') {
266+
content.increment();
267+
StringSliceUtil.skipWhitespaceAndNL(content);
268+
269+
identifier = placeable.stringValue();
270+
271+
placeable = StringSliceUtil.getExpression(content);
272+
}
273+
274+
return new ImmutablePair<>(identifier, placeable);
275+
}
276+
231277
private static StringSlice getNumber(final StringSlice slice) {
232278
char character = slice.getChar();
233279
final int start = slice.getPosition();

0 commit comments

Comments
 (0)