Merge branch 'master' into deprecate-jjtree-methods
This commit is contained in:
@ -127,6 +127,8 @@ You can identify them with the `@InternalApi` annotation. You'll also get a depr
|
|||||||
* [#2169](https://github.com/pmd/pmd/pull/2169): \[modelica] Follow-up fixes for Modelica language module - [Anatoly Trosinenko](https://github.com/atrosinenko)
|
* [#2169](https://github.com/pmd/pmd/pull/2169): \[modelica] Follow-up fixes for Modelica language module - [Anatoly Trosinenko](https://github.com/atrosinenko)
|
||||||
* [#2193](https://github.com/pmd/pmd/pull/2193): \[core] Fix odd logic in test runner - [Egor Bredikhin](https://github.com/Egor18)
|
* [#2193](https://github.com/pmd/pmd/pull/2193): \[core] Fix odd logic in test runner - [Egor Bredikhin](https://github.com/Egor18)
|
||||||
* [#2194](https://github.com/pmd/pmd/pull/2194): \[java] Fix odd logic in AvoidUsingHardCodedIPRule - [Egor Bredikhin](https://github.com/Egor18)
|
* [#2194](https://github.com/pmd/pmd/pull/2194): \[java] Fix odd logic in AvoidUsingHardCodedIPRule - [Egor Bredikhin](https://github.com/Egor18)
|
||||||
|
* [#2195](https://github.com/pmd/pmd/pull/2195): \[modelica] Normalize invalid node ranges - [Anatoly Trosinenko](https://github.com/atrosinenko)
|
||||||
|
* [#2199](https://github.com/pmd/pmd/pull/2199): \[modelica] Fix Javadoc tags - [Anatoly Trosinenko](https://github.com/atrosinenko)
|
||||||
|
|
||||||
{% endtocmaker %}
|
{% endtocmaker %}
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ public final class CppParser {
|
|||||||
int i;
|
int i;
|
||||||
if (t.kind != SCOPE)
|
if (t.kind != SCOPE)
|
||||||
{
|
{
|
||||||
s.append(t.image);
|
s.append(t.getImage());
|
||||||
t = getToken(2);
|
t = getToken(2);
|
||||||
i = 3;
|
i = 3;
|
||||||
}
|
}
|
||||||
@ -110,8 +110,8 @@ public final class CppParser {
|
|||||||
|
|
||||||
while (t.kind == SCOPE)
|
while (t.kind == SCOPE)
|
||||||
{
|
{
|
||||||
s.append(t.image);
|
s.append(t.getImage());
|
||||||
s.append((t = getToken(i++)).image);
|
s.append((t = getToken(i++)).getImage());
|
||||||
t = getToken(i++);
|
t = getToken(i++);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -606,12 +606,12 @@ String scope_override() :
|
|||||||
("::") { name += "::"; }
|
("::") { name += "::"; }
|
||||||
(
|
(
|
||||||
LOOKAHEAD(2) t = <ID> ("<" template_argument_list() ">")? "::"
|
LOOKAHEAD(2) t = <ID> ("<" template_argument_list() ">")? "::"
|
||||||
{ name += t.image + "::"; }
|
{ name += t.getImage() + "::"; }
|
||||||
)*
|
)*
|
||||||
|
|
|
|
||||||
(
|
(
|
||||||
LOOKAHEAD(2) t = <ID> ("<" template_argument_list() ">")? "::"
|
LOOKAHEAD(2) t = <ID> ("<" template_argument_list() ">")? "::"
|
||||||
{ name += t.image + "::"; }
|
{ name += t.getImage() + "::"; }
|
||||||
)+
|
)+
|
||||||
)
|
)
|
||||||
{ return name; }
|
{ return name; }
|
||||||
@ -627,7 +627,7 @@ String qualified_id() :
|
|||||||
[ LOOKAHEAD(scope_override_lookahead()) name = scope_override() ]
|
[ LOOKAHEAD(scope_override_lookahead()) name = scope_override() ]
|
||||||
(
|
(
|
||||||
t = <ID> [ "<" template_argument_list() ">" ]
|
t = <ID> [ "<" template_argument_list() ">" ]
|
||||||
{ return name + t.image; }
|
{ return name + t.getImage(); }
|
||||||
|
|
|
|
||||||
"operator" optor() { return "operator"; }
|
"operator" optor() { return "operator"; }
|
||||||
)
|
)
|
||||||
@ -718,7 +718,7 @@ void class_specifier() :
|
|||||||
|
|
|
|
||||||
LOOKAHEAD(2) t = <ID>
|
LOOKAHEAD(2) t = <ID>
|
||||||
{
|
{
|
||||||
sc = (ClassScope)sym.OpenScope(t.image, true);
|
sc = (ClassScope)sym.OpenScope(t.getImage(), true);
|
||||||
}
|
}
|
||||||
(base_clause(sc))?
|
(base_clause(sc))?
|
||||||
"{"
|
"{"
|
||||||
@ -729,7 +729,7 @@ void class_specifier() :
|
|||||||
}
|
}
|
||||||
|
|
|
|
||||||
t=<ID> (LOOKAHEAD(2) "<" template_argument_list() ">")?
|
t=<ID> (LOOKAHEAD(2) "<" template_argument_list() ">")?
|
||||||
{ sym.PutTypeName(t.image); }
|
{ sym.PutTypeName(t.getImage()); }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -745,7 +745,7 @@ void base_specifier(ClassScope scope) :
|
|||||||
("virtual" (access_specifier())? | access_specifier() ("virtual")?)?
|
("virtual" (access_specifier())? | access_specifier() ("virtual")?)?
|
||||||
(LOOKAHEAD(scope_override_lookahead()) scope_override())?
|
(LOOKAHEAD(scope_override_lookahead()) scope_override())?
|
||||||
t = <ID> ("<" template_argument_list() ">")?
|
t = <ID> ("<" template_argument_list() ">")?
|
||||||
{ scope.AddSuper(sym.GetScope(t.image));
|
{ scope.AddSuper(sym.GetScope(t.getImage()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -837,7 +837,7 @@ void enum_specifier() :
|
|||||||
"{" enumerator_list() "}"
|
"{" enumerator_list() "}"
|
||||||
|
|
|
|
||||||
t=<ID> (LOOKAHEAD(2) "{" enumerator_list() "}")?
|
t=<ID> (LOOKAHEAD(2) "{" enumerator_list() "}")?
|
||||||
{ sym.PutTypeName(t.image); }
|
{ sym.PutTypeName(t.getImage()); }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -894,7 +894,7 @@ String direct_declarator() :
|
|||||||
{
|
{
|
||||||
LOOKAHEAD(2)
|
LOOKAHEAD(2)
|
||||||
"~" t = <ID> (LOOKAHEAD(2) declarator_suffixes())?
|
"~" t = <ID> (LOOKAHEAD(2) declarator_suffixes())?
|
||||||
{ return "~" + t.image; }
|
{ return "~" + t.getImage(); }
|
||||||
|
|
|
|
||||||
"(" name = declarator() ")" (LOOKAHEAD(2) declarator_suffixes())?
|
"(" name = declarator() ")" (LOOKAHEAD(2) declarator_suffixes())?
|
||||||
{ return name; }
|
{ return name; }
|
||||||
@ -1149,7 +1149,7 @@ void template_parameter() :
|
|||||||
{ Token t; }
|
{ Token t; }
|
||||||
{
|
{
|
||||||
LOOKAHEAD(3)
|
LOOKAHEAD(3)
|
||||||
"class" t=<ID> { sym.PutTypeName(t.image); }
|
"class" t=<ID> { sym.PutTypeName(t.getImage()); }
|
||||||
|
|
|
|
||||||
parameter_declaration()
|
parameter_declaration()
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,13 @@
|
|||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<artifactId>kotlin-maven-plugin</artifactId>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
@ -70,10 +77,20 @@
|
|||||||
<artifactId>pmd-core</artifactId>
|
<artifactId>pmd-core</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
|
<artifactId>pmd-lang-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd-test</artifactId>
|
<artifactId>pmd-test</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.vintage</groupId>
|
||||||
|
<artifactId>junit-vintage-engine</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
@ -34,14 +34,14 @@ abstract class AbstractModelicaImportClause extends AbstractModelicaNode impleme
|
|||||||
abstract boolean isQualified();
|
abstract boolean isQualified();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A template method to be used by {@link resolveSimpleName}. Usually used to fetch the lexically referenced
|
* A template method to be used by {@link #resolveSimpleName}. Usually used to fetch the lexically referenced
|
||||||
* class in the corresponding import statement.
|
* class in the corresponding import statement.
|
||||||
*/
|
*/
|
||||||
protected abstract ResolutionResult<ModelicaDeclaration> getCacheableImportSources(ResolutionState state, ModelicaScope scope);
|
protected abstract ResolutionResult<ModelicaDeclaration> getCacheableImportSources(ResolutionState state, ModelicaScope scope);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A template method to be used by {@link resolveSimpleName}. Usually used to try to fetch declarations for
|
* A template method to be used by {@link #resolveSimpleName}. Usually used to try to fetch declarations for
|
||||||
* <code>simpleName</code> from particular <i>source</i> returned by {@link getCacheableImportSources}.
|
* <code>simpleName</code> from particular <i>source</i> returned by {@link #getCacheableImportSources}.
|
||||||
*/
|
*/
|
||||||
protected abstract void fetchImportedClassesFromSource(ResolutionContext result, ModelicaDeclaration source, String simpleName) throws Watchdog.CountdownException;
|
protected abstract void fetchImportedClassesFromSource(ResolutionContext result, ModelicaDeclaration source, String simpleName) throws Watchdog.CountdownException;
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
package net.sourceforge.pmd.lang.modelica.ast;
|
package net.sourceforge.pmd.lang.modelica.ast;
|
||||||
|
|
||||||
|
import net.sourceforge.pmd.lang.ast.GenericToken;
|
||||||
import net.sourceforge.pmd.lang.ast.impl.javacc.AbstractJjtreeNode;
|
import net.sourceforge.pmd.lang.ast.impl.javacc.AbstractJjtreeNode;
|
||||||
import net.sourceforge.pmd.lang.modelica.resolver.ModelicaScope;
|
import net.sourceforge.pmd.lang.modelica.resolver.ModelicaScope;
|
||||||
|
|
||||||
@ -17,6 +18,13 @@ import net.sourceforge.pmd.lang.modelica.resolver.ModelicaScope;
|
|||||||
* @see ModelicaNode for public API.
|
* @see ModelicaNode for public API.
|
||||||
*/
|
*/
|
||||||
abstract class AbstractModelicaNode extends AbstractJjtreeNode<ModelicaNode> implements ModelicaNode {
|
abstract class AbstractModelicaNode extends AbstractJjtreeNode<ModelicaNode> implements ModelicaNode {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kind for implicit tokens. Negative because JavaCC only picks
|
||||||
|
* positive numbers for token kinds.
|
||||||
|
*/
|
||||||
|
private static final int IMPLICIT_TOKEN = -1;
|
||||||
|
|
||||||
private ModelicaParser parser;
|
private ModelicaParser parser;
|
||||||
private ModelicaScope ownScope;
|
private ModelicaScope ownScope;
|
||||||
|
|
||||||
@ -38,23 +46,67 @@ abstract class AbstractModelicaNode extends AbstractJjtreeNode<ModelicaNode> imp
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void jjtOpen() {
|
public int getBeginLine() {
|
||||||
if (beginLine == -1 && parser.token.next != null) {
|
return jjtGetFirstToken().getBeginLine();
|
||||||
beginLine = parser.token.next.beginLine;
|
|
||||||
beginColumn = parser.token.next.beginColumn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getBeginColumn() {
|
||||||
|
return jjtGetFirstToken().getBeginColumn();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getEndLine() {
|
||||||
|
return jjtGetLastToken().getEndLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getEndColumn() {
|
||||||
|
return jjtGetLastToken().getEndColumn();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void jjtClose() {
|
public void jjtClose() {
|
||||||
if (beginLine == -1 && (children == null || children.length == 0)) {
|
|
||||||
beginColumn = parser.token.beginColumn;
|
// in jjtClose, jjtSetLastToken has not been called yet, so we use parser.token.next
|
||||||
|
if (parser.token.next == jjtGetFirstToken()) {
|
||||||
|
// Reversed, this node consumed no token.
|
||||||
|
// Forge a token with the correct coordinates, and zero length
|
||||||
|
|
||||||
|
Token next = parser.token.next;
|
||||||
|
|
||||||
|
Token implicit = new Token(IMPLICIT_TOKEN, "");
|
||||||
|
implicit.beginColumn = next.beginColumn;
|
||||||
|
implicit.endColumn = next.beginColumn - 1; // because of inclusive columns..
|
||||||
|
implicit.beginLine = next.beginLine;
|
||||||
|
implicit.endLine = next.beginLine;
|
||||||
|
|
||||||
|
// insert it right before the next token
|
||||||
|
// as a special token
|
||||||
|
implicit.next = next;
|
||||||
|
|
||||||
|
if (next.specialToken != null) {
|
||||||
|
next.specialToken.next = implicit;
|
||||||
|
implicit.specialToken = next.specialToken;
|
||||||
}
|
}
|
||||||
if (beginLine == -1) {
|
|
||||||
beginLine = parser.token.beginLine;
|
next.specialToken = implicit;
|
||||||
|
|
||||||
|
|
||||||
|
// set it as both first and last
|
||||||
|
// beware, JJTree calls jjtSetLastToken after this routine..
|
||||||
|
// hence the override below
|
||||||
|
jjtSetFirstToken(implicit);
|
||||||
|
jjtSetLastToken(implicit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void jjtSetLastToken(GenericToken token) {
|
||||||
|
// don't let jjtree override tokens we've chosen
|
||||||
|
if (lastToken == null) {
|
||||||
|
super.jjtSetLastToken(token);
|
||||||
}
|
}
|
||||||
endLine = parser.token.endLine;
|
|
||||||
endColumn = parser.token.endColumn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -69,7 +69,7 @@ public final class CompositeName {
|
|||||||
/**
|
/**
|
||||||
* Tries to match the <code>prefix</code> argument with the first elements of this name
|
* Tries to match the <code>prefix</code> argument with the first elements of this name
|
||||||
*
|
*
|
||||||
* @returns the remaining elements on success or null on failure
|
* @return the remaining elements on success or null on failure
|
||||||
*/
|
*/
|
||||||
public CompositeName matchPrefix(String[] prefix) {
|
public CompositeName matchPrefix(String[] prefix) {
|
||||||
return matchPrefix(prefix, 0);
|
return matchPrefix(prefix, 0);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
package net.sourceforge.pmd.lang.modelica.resolver;
|
package net.sourceforge.pmd.lang.modelica.resolver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A watchdog counter initialized with some value. Throws an exception after the specified {@link decrement} calls.
|
* A watchdog counter initialized with some value. Throws an exception after the specified {@link #decrement} calls.
|
||||||
*
|
*
|
||||||
* Is used to break possible resolution loops.
|
* Is used to break possible resolution loops.
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.sourceforge.pmd.lang.modelica.ast
|
||||||
|
|
||||||
|
import io.kotlintest.should
|
||||||
|
import io.kotlintest.shouldBe
|
||||||
|
import io.kotlintest.specs.FunSpec
|
||||||
|
import net.sourceforge.pmd.lang.LanguageRegistry
|
||||||
|
import net.sourceforge.pmd.lang.ast.Node
|
||||||
|
import net.sourceforge.pmd.lang.ast.test.matchNode
|
||||||
|
import net.sourceforge.pmd.lang.ast.test.shouldBe
|
||||||
|
import java.io.StringReader
|
||||||
|
|
||||||
|
class ModelicaCoordsTest : FunSpec({
|
||||||
|
|
||||||
|
|
||||||
|
test("Test line/column numbers for implicit nodes") {
|
||||||
|
|
||||||
|
"""
|
||||||
|
package TestPackage
|
||||||
|
package EmptyPackage
|
||||||
|
end EmptyPackage;
|
||||||
|
end TestPackage;
|
||||||
|
""".trim().parseModelica() should matchNode<ASTStoredDefinition> {
|
||||||
|
|
||||||
|
it.assertBounds(1, 1, 4, 16)
|
||||||
|
|
||||||
|
child<ASTClassDefinition> {
|
||||||
|
it.assertBounds(1, 1, 4, 15)
|
||||||
|
|
||||||
|
child<ASTClassPrefixes> {
|
||||||
|
it.assertBounds(1, 1, 1, 7)
|
||||||
|
|
||||||
|
child<ASTPackageClause> {
|
||||||
|
it.assertBounds(1, 1, 1, 7)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
child<ASTClassSpecifier> {
|
||||||
|
it.assertBounds(1, 9, 4, 15)
|
||||||
|
|
||||||
|
child<ASTSimpleLongClassSpecifier> {
|
||||||
|
it.assertBounds(1, 9, 4, 15)
|
||||||
|
|
||||||
|
child<ASTSimpleName> {
|
||||||
|
it.assertBounds(1, 9, 1, 19)
|
||||||
|
}
|
||||||
|
child<ASTComposition> {
|
||||||
|
it.assertBounds(2, 3, 3, 19)
|
||||||
|
|
||||||
|
child<ASTElementList> {
|
||||||
|
it.assertBounds(2, 3, 3, 19)
|
||||||
|
|
||||||
|
child<ASTRegularElement> {
|
||||||
|
it.assertBounds(2, 3, 3, 18)
|
||||||
|
|
||||||
|
child<ASTClassDefinition> {
|
||||||
|
it.assertBounds(2, 3, 3, 18)
|
||||||
|
it.isPartial shouldBe false
|
||||||
|
|
||||||
|
child<ASTClassPrefixes> {
|
||||||
|
it.assertBounds(2, 3, 2, 9)
|
||||||
|
|
||||||
|
child<ASTPackageClause> {
|
||||||
|
it.assertBounds(2, 3, 2, 9)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
child<ASTClassSpecifier> {
|
||||||
|
it.assertBounds(2, 11, 3, 18)
|
||||||
|
|
||||||
|
child<ASTSimpleLongClassSpecifier> {
|
||||||
|
it.assertBounds(2, 11, 3, 18)
|
||||||
|
it.simpleClassName shouldBe "EmptyPackage"
|
||||||
|
|
||||||
|
child<ASTSimpleName> {
|
||||||
|
it.assertBounds(2, 11, 2, 22)
|
||||||
|
|
||||||
|
}
|
||||||
|
child<ASTComposition> {
|
||||||
|
|
||||||
|
it.assertBounds(3, 3, 3, 2)
|
||||||
|
|
||||||
|
child<ASTElementList> {
|
||||||
|
/*
|
||||||
|
This ElementList is empty and has no explicit token.
|
||||||
|
*/
|
||||||
|
|
||||||
|
it.assertBounds(3, 3, 3, 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
child<ASTSimpleName> {
|
||||||
|
it.assertBounds(3, 7, 3, 18)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
child<ASTSimpleName> {
|
||||||
|
it.assertBounds(4, 5, 4, 15)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
fun String.parseModelica(): ASTStoredDefinition {
|
||||||
|
val ver = LanguageRegistry.getLanguage("Modelica").defaultVersion.languageVersionHandler
|
||||||
|
val parser = ver.getParser(ver.defaultParserOptions)
|
||||||
|
|
||||||
|
return parser.parse(":dummy:", StringReader(this)) as ASTStoredDefinition
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Node.assertBounds(bline: Int, bcol: Int, eline: Int, ecol: Int) {
|
||||||
|
this::getBeginLine shouldBe bline
|
||||||
|
this::getBeginColumn shouldBe bcol
|
||||||
|
this::getEndLine shouldBe eline
|
||||||
|
this::getEndColumn shouldBe ecol
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -998,9 +998,9 @@ TOKEN:
|
|||||||
/*
|
/*
|
||||||
* Remove the double period if it is there
|
* Remove the double period if it is there
|
||||||
*/
|
*/
|
||||||
if (matchedToken.image.endsWith("..")) {
|
if (matchedToken.getImage().endsWith("..")) {
|
||||||
input_stream.backup(2);
|
input_stream.backup(2);
|
||||||
matchedToken.image = matchedToken.image.substring(0,matchedToken.image.length()-2);
|
matchedToken.image = matchedToken.getImage().substring(0,matchedToken.getImage().length()-2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1197,7 +1197,7 @@ void EscapedDirective() : {}
|
|||||||
/*
|
/*
|
||||||
* churn and burn..
|
* churn and burn..
|
||||||
*/
|
*/
|
||||||
t.image = escapedDirective( t.image );
|
t.image = escapedDirective( t.getImage() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1238,7 +1238,7 @@ void Escape() : {}
|
|||||||
/*
|
/*
|
||||||
* if that failed, lets lookahead to see if we matched a PD or a VM
|
* if that failed, lets lookahead to see if we matched a PD or a VM
|
||||||
*/
|
*/
|
||||||
String nTag = t.next.image.substring(1);
|
String nTag = t.next.getImage().substring(1);
|
||||||
if (strictEscape
|
if (strictEscape
|
||||||
|| isDirective(nTag)
|
|| isDirective(nTag)
|
||||||
|| macroNames.containsKey(nTag)
|
|| macroNames.containsKey(nTag)
|
||||||
@ -1380,11 +1380,11 @@ VmNode Directive() :
|
|||||||
String directiveName;
|
String directiveName;
|
||||||
if (t.kind == VmParserConstants.BRACKETED_WORD)
|
if (t.kind == VmParserConstants.BRACKETED_WORD)
|
||||||
{
|
{
|
||||||
directiveName = t.image.substring(2, t.image.length() - 1);
|
directiveName = t.getImage().substring(2, t.getImage().length() - 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
directiveName = t.image.substring(1);
|
directiveName = t.getImage().substring(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
d = getDirective(directiveName);
|
d = getDirective(directiveName);
|
||||||
@ -1459,13 +1459,13 @@ VmNode Directive() :
|
|||||||
else if (isVM)
|
else if (isVM)
|
||||||
{
|
{
|
||||||
throw new MacroParseException("Invalid arg #"
|
throw new MacroParseException("Invalid arg #"
|
||||||
+ argPos + " in VM " + t.image, currentTemplateName, t);
|
+ argPos + " in VM " + t.getImage(), currentTemplateName, t);
|
||||||
}
|
}
|
||||||
/* if #foreach and it's the 2nd arg, ok */
|
/* if #foreach and it's the 2nd arg, ok */
|
||||||
else if (d != null && (!directiveName.equals("foreach") || argPos != 1))
|
else if (d != null && (!directiveName.equals("foreach") || argPos != 1))
|
||||||
{
|
{
|
||||||
throw new MacroParseException("Invalid arg #"
|
throw new MacroParseException("Invalid arg #"
|
||||||
+ argPos + " in directive " + t.image, currentTemplateName, t);
|
+ argPos + " in directive " + t.getImage(), currentTemplateName, t);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1533,7 +1533,7 @@ VmNode Directive() :
|
|||||||
{
|
{
|
||||||
// Add the macro name so that we can peform escape processing
|
// Add the macro name so that we can peform escape processing
|
||||||
// on defined macros
|
// on defined macros
|
||||||
String macroName = ((AbstractVmNode)jjtThis.jjtGetChild(0)).getFirstToken().image;
|
String macroName = ((AbstractVmNode)jjtThis.jjtGetChild(0)).getFirstToken().getImage();
|
||||||
macroNames.put(macroName, macroName);
|
macroNames.put(macroName, macroName);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user