Skip to content

Commit 77682c1

Browse files
committed
Restructuring and fix parenthesis bug
Restructuring the code so that the parsing of the parameters is not only in the `FluentFunction` class. Now when someone writes something like `{-term(test: ")")}` it will work just fine.
1 parent 1a34f49 commit 77682c1

File tree

4 files changed

+68
-94
lines changed

4 files changed

+68
-94
lines changed

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: 4 additions & 62 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
/**
@@ -99,10 +45,6 @@ protected FluentArgs getArguments(final DirectFluentBundle bundle, final FluentA
9945
return this.arguments;
10046
}
10147

102-
protected FluentArgs getFluentArgumentInstance() {
103-
return new FunctionFluentArguments();
104-
}
105-
10648
/**
10749
* Returns the {@link FluentElement} that the function is returning.
10850
*

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

Lines changed: 60 additions & 22 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();
@@ -228,6 +214,58 @@ private static FluentPlaceable expressionGetAttribute(final StringSlice slice, F
228214
return expression;
229215
}
230216

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

0 commit comments

Comments
 (0)