Skip to content

Commit 4b43c5f

Browse files
committed
Fix for return value of getMacroLocation function
1 parent 0cdcbac commit 4b43c5f

File tree

5 files changed

+121
-59
lines changed

5 files changed

+121
-59
lines changed

src/main/java/net/rptools/maptool/client/functions/MacroFunctions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ public Object childEvaluate(
186186
return MapTool.getParser().getMacroName();
187187

188188
} else if (functionName.equalsIgnoreCase("getMacroLocation")) {
189-
return MapTool.getParser().getMacroSource().getLocation();
190-
189+
var source = MapTool.getParser().getMacroSource();
190+
return source.getCallableLocation();
191191
} else if (functionName.equalsIgnoreCase("setMacroCommand")) {
192192
FunctionUtil.checkNumberParam(functionName, parameters, 2, 4);
193193
FunctionUtil.blockUntrustedMacro(functionName);

src/main/java/net/rptools/maptool/client/macro/MacroLocation.java

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public class MacroLocation {
5555
/** The URI of the macro, if applicable. */
5656
@Nullable private final URI uri;
5757

58+
/** The token associated with this macro, if applicable. */
59+
@Nullable private final Token token;
60+
5861
/** MacroLocationFactory used to create locations during parsing. */
5962
private static final MacroLocationFactory factory = MacroLocationFactory.getInstance();
6063

@@ -65,16 +68,30 @@ public class MacroLocation {
6568
* @param source the source of the macro.
6669
* @param location the location of the macro.
6770
* @param uri the URI of the macro, if applicable.
71+
* @param token the associated token, if applicable.
6872
*/
6973
MacroLocation(
7074
@Nonnull String name,
7175
@Nonnull MacroSource source,
7276
@Nonnull String location,
73-
@Nullable URI uri) {
77+
@Nullable URI uri,
78+
@Nullable Token token) {
7479
this.name = name;
7580
this.source = source;
7681
this.location = location;
7782
this.uri = uri;
83+
this.token = token;
84+
}
85+
86+
/**
87+
* Creates a new MacroLocation with the given name and source.
88+
*
89+
* @param name the name of the macro.
90+
* @param source the source of the macro.
91+
* @param location the location of the macro.
92+
*/
93+
MacroLocation(@Nonnull String name, @Nonnull MacroSource source, @Nonnull String location) {
94+
this(name, source, location, null, null);
7895
}
7996

8097
/** Enumeration to represent the source of the macro. */
@@ -148,7 +165,7 @@ public boolean allowsAtThis() {
148165
*
149166
* @param qMacroName the qualified macro name to parse.
150167
* @param calledFrom the location that called this macro, if applicable.
151-
* @param token the token that called this macro, if applicable.
168+
* @param token the token for this macro, if applicable.
152169
* @return a MacroLocation object representing the parsed macro name.
153170
*/
154171
public static MacroLocation parseMacroName(
@@ -159,24 +176,21 @@ public static MacroLocation parseMacroName(
159176
return new MacroLocation(
160177
qMacroName.substring(0, qMacroName.indexOf("@")),
161178
MacroSource.campaign,
162-
MacroSource.campaign.getSourceName(),
163-
null);
179+
MacroSource.campaign.getSourceName());
164180
}
165181

166182
if (qMacroNameLower.contains("@gm")) {
167183
return new MacroLocation(
168184
qMacroName.substring(0, qMacroName.indexOf("@")),
169185
MacroSource.gm,
170-
MacroSource.gm.getSourceName(),
171-
null);
186+
MacroSource.gm.getSourceName());
172187
}
173188

174189
if (qMacroNameLower.contains("@global")) {
175190
return new MacroLocation(
176191
qMacroName.substring(0, qMacroName.indexOf("@")),
177192
MacroSource.global,
178-
MacroSource.global.getSourceName(),
179-
null);
193+
MacroSource.global.getSourceName());
180194
}
181195

182196
if (qMacroNameLower.contains("@token")) {
@@ -187,13 +201,14 @@ public static MacroLocation parseMacroName(
187201
qMacroName.substring(0, qMacroName.indexOf("@")),
188202
MacroSource.token,
189203
token.getName(),
190-
null);
204+
null,
205+
token);
191206
}
192207

193208
if (qMacroNameLower.contains("@lib:")) {
194-
String libName = qMacroName.substring(qMacroName.indexOf("@") + 1);
195-
return new MacroLocation(
196-
qMacroName.substring(0, qMacroName.indexOf("@")), MacroSource.library, libName, null);
209+
String macroName = qMacroName.substring(0, qMacroName.indexOf("@"));
210+
String namespace = qMacroName.replaceFirst("^[^@]*@(?i)lib:", "");
211+
return new MacroLocation(macroName, MacroSource.library, namespace, null, token);
197212
}
198213

199214
if (qMacroNameLower.contains("@this")) {
@@ -207,7 +222,7 @@ public static MacroLocation parseMacroName(
207222
return factory.createUnknownLocation(qMacroName);
208223
}
209224
}
210-
return new MacroLocation(name, cfrom.getSource(), cfrom.getLocation(), null);
225+
return new MacroLocation(name, cfrom.getSource(), cfrom.getLocation(), null, token);
211226
}
212227

213228
// If none of the above then assume it is a URI
@@ -230,7 +245,7 @@ public static MacroLocation parseMacroName(
230245
return factory.createUnknownLocation(qMacroName);
231246
}
232247

233-
return new MacroLocation(uri.getPath().substring(1), MacroSource.uri, uri.getHost(), uri);
248+
return new MacroLocation(uri.getPath().substring(1), MacroSource.uri, uri.getHost(), uri, null);
234249
}
235250

236251
/**
@@ -269,6 +284,31 @@ public URI getUri() {
269284
return uri;
270285
}
271286

287+
/**
288+
* Returns the token associated with this macro, if applicable.
289+
*
290+
* @return the token associated with this macro, or null if not applicable.
291+
*/
292+
public Token getToken() {
293+
return token;
294+
}
295+
296+
/**
297+
* Returns the location of the macro that can be called from macro code using the '@' syntax.
298+
*
299+
* @return the location of the macro that can be called from other macros.
300+
*/
301+
@Nonnull
302+
public String getCallableLocation() {
303+
if (source == MacroSource.token) {
304+
return "Token:" + location;
305+
} else if (source == MacroSource.library) {
306+
return token != null ? token.getName() : location;
307+
} else {
308+
return location;
309+
}
310+
}
311+
272312
@Override
273313
public String toString() {
274314
StringBuilder sb = new StringBuilder();
@@ -282,6 +322,10 @@ public String toString() {
282322
sb.append(", uri='");
283323
sb.append(uri);
284324
}
325+
if (token != null) {
326+
sb.append(", token='");
327+
sb.append(token.getName());
328+
}
285329
sb.append("'}");
286330

287331
return sb.toString();

src/main/java/net/rptools/maptool/client/macro/MacroLocationFactory.java

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public static MacroLocationFactory getInstance() {
4949
* @return a new {@link MacroLocation} object for an unknown location.
5050
*/
5151
public MacroLocation createUnknownLocation(@Nonnull String name) {
52-
return new MacroLocation(name, MacroSource.unknown, "", null);
52+
return new MacroLocation(name, MacroSource.unknown, "");
5353
}
5454

5555
/**
@@ -59,7 +59,7 @@ public MacroLocation createUnknownLocation(@Nonnull String name) {
5959
* @return a new {@link MacroLocation} object for a global Panel.
6060
*/
6161
public MacroLocation createGlobalLocation(@Nonnull String name) {
62-
return new MacroLocation(name, MacroSource.global, MacroSource.global.getSourceName(), null);
62+
return new MacroLocation(name, MacroSource.global, MacroSource.global.getSourceName());
6363
}
6464

6565
/**
@@ -69,8 +69,7 @@ public MacroLocation createGlobalLocation(@Nonnull String name) {
6969
* @return a new {@link MacroLocation} object for a campaign Panel.
7070
*/
7171
public MacroLocation createCampaignLocation(@Nonnull String name) {
72-
return new MacroLocation(
73-
name, MacroSource.campaign, MacroSource.campaign.getSourceName(), null);
72+
return new MacroLocation(name, MacroSource.campaign, MacroSource.campaign.getSourceName());
7473
}
7574

7675
/**
@@ -81,18 +80,7 @@ public MacroLocation createCampaignLocation(@Nonnull String name) {
8180
* @return a new {@link MacroLocation} object for a token.
8281
*/
8382
public MacroLocation createTokenLocation(@Nonnull String name, @Nonnull Token token) {
84-
return createTokenLocation(name, token.getName());
85-
}
86-
87-
/**
88-
* Creates a new {@link MacroLocation} object for a token.
89-
*
90-
* @param name the name of the macro.
91-
* @param tokenName the name of the token associated with the macro.
92-
* @return a new {@link MacroLocation} object for a token.
93-
*/
94-
public MacroLocation createTokenLocation(@Nonnull String name, @Nonnull String tokenName) {
95-
return new MacroLocation(name, MacroSource.token, tokenName, null);
83+
return new MacroLocation(name, MacroSource.token, token.getName(), null, token);
9684
}
9785

9886
/**
@@ -103,18 +91,8 @@ public MacroLocation createTokenLocation(@Nonnull String name, @Nonnull String t
10391
* @return a new {@link MacroLocation} object for a library token.
10492
*/
10593
public MacroLocation createLibTokenLocation(@Nonnull String name, @Nonnull Token libToken) {
106-
return createLibTokenLocation(name, libToken.getName());
107-
}
108-
109-
/**
110-
* Creates a new {@link MacroLocation} object for a library token.
111-
*
112-
* @param name the name of the macro.
113-
* @param libTokenName the name of the library token associated with the macro.
114-
* @return a new {@link MacroLocation} object for a library token.
115-
*/
116-
public MacroLocation createLibTokenLocation(@Nonnull String name, @Nonnull String libTokenName) {
117-
return new MacroLocation(name, MacroSource.library, libTokenName.substring(4), null);
94+
return new MacroLocation(
95+
name, MacroSource.library, libToken.getName().substring(4), null, libToken);
11896
}
11997

12098
/**
@@ -124,7 +102,7 @@ public MacroLocation createLibTokenLocation(@Nonnull String name, @Nonnull Strin
124102
* @return a new {@link MacroLocation} object for a GM Panel.
125103
*/
126104
public MacroLocation createGmLocation(@Nonnull String name) {
127-
return new MacroLocation(name, MacroSource.gm, MacroSource.gm.getSourceName(), null);
105+
return new MacroLocation(name, MacroSource.gm, MacroSource.gm.getSourceName());
128106
}
129107

130108
/**
@@ -135,7 +113,7 @@ public MacroLocation createGmLocation(@Nonnull String name) {
135113
*/
136114
public MacroLocation createExecFunctionLocation(@Nonnull String functionName) {
137115
return new MacroLocation(
138-
MacroSource.execFunction.getSourceName(), MacroSource.execFunction, functionName, null);
116+
MacroSource.execFunction.getSourceName(), MacroSource.execFunction, functionName);
139117
}
140118

141119
/**
@@ -148,8 +126,7 @@ public MacroLocation createMacroLinkLocation(@Nonnull String name) {
148126
return new MacroLocation(
149127
MacroSource.macroLink.getSourceName(),
150128
MacroSource.macroLink,
151-
MacroSource.macroLink.getSourceName(),
152-
null);
129+
MacroSource.macroLink.getSourceName());
153130
}
154131

155132
/**
@@ -159,15 +136,14 @@ public MacroLocation createMacroLinkLocation(@Nonnull String name) {
159136
* @return a new {@link MacroLocation} object for an event.
160137
*/
161138
public MacroLocation createEventLocation(@Nonnull String name) {
162-
return new MacroLocation(MacroSource.event.getSourceName(), MacroSource.event, name, null);
139+
return new MacroLocation(MacroSource.event.getSourceName(), MacroSource.event, name);
163140
}
164141

165142
public MacroLocation createSentryIoLoggingLocation() {
166143
return new MacroLocation(
167144
MacroSource.sentryIoLogging.getSourceName(),
168145
MacroSource.sentryIoLogging,
169-
MacroSource.sentryIoLogging.getSourceName(),
170-
null);
146+
MacroSource.sentryIoLogging.getSourceName());
171147
}
172148

173149
/**
@@ -186,7 +162,7 @@ public MacroLocation createUriLocation(@Nonnull String name, @Nullable URI calle
186162
}
187163
uri = calledFrom.resolve(uri);
188164
}
189-
return new MacroLocation(uri.getPath(), MacroSource.uri, uri.getHost(), uri);
165+
return new MacroLocation(uri.getPath(), MacroSource.uri, uri.getHost(), uri, null);
190166
} catch (URISyntaxException e) {
191167
return createUnknownLocation(name);
192168
}
@@ -195,12 +171,12 @@ public MacroLocation createUriLocation(@Nonnull String name, @Nullable URI calle
195171
/**
196172
* Creates a new {@link MacroLocation} object for the chat box.
197173
*
198-
* @param token the token associated with the the chat box.
174+
* @param token the token associated with the chat box.
199175
* @return a new {@link MacroLocation} object for a the chat box.
200176
*/
201177
public MacroLocation createChatLocation() {
202178
return new MacroLocation(
203-
MacroSource.chat.getSourceName(), MacroSource.chat, MacroSource.chat.getSourceName(), null);
179+
MacroSource.chat.getSourceName(), MacroSource.chat, MacroSource.chat.getSourceName());
204180
}
205181

206182
/**
@@ -214,6 +190,7 @@ public MacroLocation createToolTipLocation(@Nullable Token token) {
214190
MacroSource.tooltip.getSourceName(),
215191
MacroSource.tooltip,
216192
token != null ? token.getName() : "",
217-
null);
193+
null,
194+
token);
218195
}
219196
}

src/test/java/net/rptools/maptool/client/macro/MacroLocationFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ void testCreateTokenLocation() {
6767

6868
@Test
6969
void testCreateLibTokenLocation() {
70-
MacroLocation location = factory.createLibTokenLocation("libMacro", "lib:TokenName");
70+
Token mockToken = Mockito.mock(Token.class);
71+
Mockito.when(mockToken.getName()).thenReturn("lib:libToken");
72+
MacroLocation location = factory.createLibTokenLocation("libMacro", mockToken);
7173
assertEquals("libMacro", location.getName());
7274
assertEquals(MacroLocation.MacroSource.library, location.getSource());
73-
assertEquals("TokenName", location.getLocation());
75+
assertEquals("libToken", location.getLocation());
7476
assertNull(location.getUri());
7577
}
7678

src/test/java/net/rptools/maptool/client/macro/MacroLocationTest.java

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void testParseNameLibToken() {
5858
MacroLocation location = MacroLocation.parseMacroName("test@lib:libName", null, null);
5959
assertEquals("test", location.getName());
6060
assertEquals(MacroLocation.MacroSource.library, location.getSource());
61-
assertEquals("lib:libName", location.getLocation());
61+
assertEquals("libName", location.getLocation());
6262
assertNull(location.getUri());
6363
}
6464

@@ -158,7 +158,7 @@ void testParseLibTokenAtThis() {
158158
MacroLocation location = MacroLocation.parseMacroName("test@this", caller, null);
159159
assertEquals("test", location.getName());
160160
assertEquals(MacroLocation.MacroSource.library, location.getSource());
161-
assertEquals("lib:libName", location.getLocation());
161+
assertEquals("libName", location.getLocation());
162162
assertNull(location.getUri());
163163
}
164164

@@ -183,4 +183,43 @@ void testParseInvalidAtThis() {
183183
assertEquals("", location.getLocation());
184184
assertNull(location.getUri());
185185
}
186+
187+
@Test
188+
void testTokenGetCallableLocation() {
189+
Token mockToken = Mockito.mock(Token.class);
190+
Mockito.when(mockToken.getName()).thenReturn("mockToken");
191+
MacroLocation location = MacroLocation.parseMacroName("test@token", null, mockToken);
192+
assertEquals("Token:mockToken", location.getCallableLocation());
193+
}
194+
195+
@Test
196+
void testCampaignGetCallableLocation() {
197+
MacroLocation location = MacroLocation.parseMacroName("test@campaign", null, null);
198+
assertEquals("campaign", location.getCallableLocation());
199+
}
200+
201+
@Test
202+
void testGmGetCallableLocation() {
203+
MacroLocation location = MacroLocation.parseMacroName("test@gm", null, null);
204+
assertEquals("gm", location.getCallableLocation());
205+
}
206+
207+
@Test
208+
void testGlobalGetCallableLocation() {
209+
MacroLocation location = MacroLocation.parseMacroName("test@global", null, null);
210+
assertEquals("global", location.getCallableLocation());
211+
}
212+
213+
@Test
214+
void testLibGetCallableLocation() {
215+
Token mockToken = Mockito.mock(Token.class);
216+
Mockito.when(mockToken.getName()).thenReturn("Lib:TestToken");
217+
MacroLocation location = MacroLocation.parseMacroName("test@Lib:TestToken", null, mockToken);
218+
assertEquals("Lib:TestToken", location.getCallableLocation());
219+
220+
Token mockToken2 = Mockito.mock(Token.class);
221+
Mockito.when(mockToken2.getName()).thenReturn("lib:TestToken");
222+
MacroLocation location2 = MacroLocation.parseMacroName("test@lib:TestToken", null, mockToken2);
223+
assertEquals("lib:TestToken", location2.getCallableLocation());
224+
}
186225
}

0 commit comments

Comments
 (0)