TILESSB-21
Added code that uses QDox to create the model.
Removed Antlr stuff and dependency on Java compiler tools.
git-svn-id: https://svn.apache.org/repos/asf/tiles/sandbox/trunk/tiles-autotag@905568 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 1ffb81d..378a39f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,17 +1,32 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>tiles-master</artifactId>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>tiles-master</artifactId>
+ <groupId>org.apache.tiles</groupId>
+ <version>1</version>
+ </parent>
<groupId>org.apache.tiles</groupId>
- <version>1</version>
- </parent>
- <groupId>org.apache.tiles</groupId>
- <artifactId>tiles-autotag</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>pom</packaging>
- <name>Autotags</name>
- <description>Automatic generation of tags.</description>
- <modules>
- <module>tiles-autotag-core</module>
- </modules>
-</project>
\ No newline at end of file
+ <artifactId>tiles-autotag</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <name>Autotags</name>
+ <description>Automatic generation of tags.</description>
+ <modules>
+ <module>tiles-autotag-core</module>
+ </modules>
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+</project>
diff --git a/tiles-autotag-core/pom.xml b/tiles-autotag-core/pom.xml
index f5ab2d2..e822e03 100644
--- a/tiles-autotag-core/pom.xml
+++ b/tiles-autotag-core/pom.xml
@@ -12,33 +12,33 @@
<name>Autotag - Core</name>
<description>Core classes for Autotag.</description>
<build>
- <plugins>
- <plugin>
- <groupId>org.antlr</groupId>
- <artifactId>antlr3-maven-plugin</artifactId>
- <version>3.2</version>
- <configuration>
- <includes>
- <include>Java.g</include>
- </includes>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>antlr</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
+ <resources>
+ </resources>
+ <testResources>
+ <testResource>
+ <directory>src/test/java</directory>
+ <includes>
+ <include>org/apache/tiles/autotag/core/internal/*.java</include>
+ </includes>
+ </testResource>
+ </testResources>
</build>
<dependencies>
<dependency>
- <groupId>org.antlr</groupId>
- <artifactId>antlr-runtime</artifactId>
- <version>3.2</version>
- <type>jar</type>
- <scope>compile</scope>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.7</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.thoughtworks.qdox</groupId>
+ <artifactId>qdox</artifactId>
+ <version>1.10.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tiles</groupId>
+ <artifactId>tiles-request-api</artifactId>
+ <version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
diff --git a/tiles-autotag-core/src/main/antlr3/Java.g b/tiles-autotag-core/src/main/antlr3/Java.g
deleted file mode 100644
index b15b943..0000000
--- a/tiles-autotag-core/src/main/antlr3/Java.g
+++ /dev/null
@@ -1,2507 +0,0 @@
-/*
- [The "BSD licence"]
- Copyright (c) 2007-2008 Terence Parr
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*
- * This file is modified by Yang Jiang (yang.jiang.z@gmail.com), taken from the original
- * java grammar in www.antlr.org, with the goal to provide a standard ANTLR grammar
- * for java, as well as an implementation to construct the same AST trees as javac does.
- *
- * The major changes of this version as compared to the original version include:
- * 1) Top level rules are changed to include all of their sub-components.
- * For example, the rule
- *
- * classOrInterfaceDeclaration
- * : classOrInterfaceModifiers (classDeclaration | interfaceDeclaration)
- * ;
- *
- * is changed to
- *
- * classOrInterfaceDeclaration
- * : classDeclaration | interfaceDeclaration
- * ;
- *
- * with classOrInterfaceModifiers been moved inside classDeclaration and
- * interfaceDeclaration.
- *
- * 2) The original version is not quite clear on certain rules like memberDecl,
- * where it mixed the styles of listing of top level rules and listing of sub rules.
- *
- * memberDecl
- * : genericMethodOrConstructorDecl
- * | memberDeclaration
- * | 'void' Identifier voidMethodDeclaratorRest
- * | Identifier constructorDeclaratorRest
- * | interfaceDeclaration
- * | classDeclaration
- * ;
- *
- * This is changed to a
- *
- * memberDecl
- * : fieldDeclaration
- * | methodDeclaration
- * | classDeclaration
- * | interfaceDeclaration
- * ;
- * by folding similar rules into single rule.
- *
- * 3) Some syntactical predicates are added for efficiency, although this is not necessary
- * for correctness.
- *
- * 4) Lexer part is rewritten completely to construct tokens needed for the parser.
- *
- * 5) This grammar adds more source level support
- *
- *
- * This grammar also adds bug fixes.
- *
- * 1) Adding typeArguments to superSuffix to alHexSignificandlow input like
- * super.<TYPE>method()
- *
- * 2) Adding typeArguments to innerCreator to allow input like
- * new Type1<String, Integer>().new Type2<String>()
- *
- * 3) conditionalExpression is changed to
- * conditionalExpression
- * : conditionalOrExpression ( '?' expression ':' conditionalExpression )?
- * ;
- * to accept input like
- * true?1:2=3
- *
- * Note: note this is by no means a valid input, by the grammar should be able to parse
- * this as
- * (true?1:2)=3
- * rather than
- * true?1:(2=3)
- *
- *
- * Know problems:
- * Won't pass input containing unicode sequence like this
- * char c = '\uffff'
- * String s = "\uffff";
- * Because Antlr does not treat '\uffff' as an valid char. This will be fixed in the next Antlr
- * release. [Fixed in Antlr-3.1.1]
- *
- * Things to do:
- * More effort to make this grammar faster.
- * Error reporting/recovering.
- *
- *
- * NOTE: If you try to compile this file from command line and Antlr gives an exception
- * like error message while compiling, add option
- * -Xconversiontimeout 100000
- * to the command line.
- * If it still doesn't work or the compilation process
- * takes too long, try to comment out the following two lines:
- * | {isValidSurrogateIdentifierStart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff')
- * | {isValidSurrogateIdentifierPart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff')
- *
- *
- * Below are comments found in the original version.
- */
-
-
-/** A Java 1.5 grammar for ANTLR v3 derived from the spec
- *
- * This is a very close representation of the spec; the changes
- * are comestic (remove left recursion) and also fixes (the spec
- * isn't exactly perfect). I have run this on the 1.4.2 source
- * and some nasty looking enums from 1.5, but have not really
- * tested for 1.5 compatibility.
- *
- * I built this with: java -Xmx100M org.antlr.Tool java.g
- * and got two errors that are ok (for now):
- * java.g:691:9: Decision can match input such as
- * "'0'..'9'{'E', 'e'}{'+', '-'}'0'..'9'{'D', 'F', 'd', 'f'}"
- * using multiple alternatives: 3, 4
- * As a result, alternative(s) 4 were disabled for that input
- * java.g:734:35: Decision can match input such as "{'$', 'A'..'Z',
- * '_', 'a'..'z', '\u00C0'..'\u00D6', '\u00D8'..'\u00F6',
- * '\u00F8'..'\u1FFF', '\u3040'..'\u318F', '\u3300'..'\u337F',
- * '\u3400'..'\u3D2D', '\u4E00'..'\u9FFF', '\uF900'..'\uFAFF'}"
- * using multiple alternatives: 1, 2
- * As a result, alternative(s) 2 were disabled for that input
- *
- * You can turn enum on/off as a keyword :)
- *
- * Version 1.0 -- initial release July 5, 2006 (requires 3.0b2 or higher)
- *
- * Primary author: Terence Parr, July 2006
- *
- * Version 1.0.1 -- corrections by Koen Vanderkimpen & Marko van Dooren,
- * October 25, 2006;
- * fixed normalInterfaceDeclaration: now uses typeParameters instead
- * of typeParameter (according to JLS, 3rd edition)
- * fixed castExpression: no longer allows expression next to type
- * (according to semantics in JLS, in contrast with syntax in JLS)
- *
- * Version 1.0.2 -- Terence Parr, Nov 27, 2006
- * java spec I built this from had some bizarre for-loop control.
- * Looked weird and so I looked elsewhere...Yep, it's messed up.
- * simplified.
- *
- * Version 1.0.3 -- Chris Hogue, Feb 26, 2007
- * Factored out an annotationName rule and used it in the annotation rule.
- * Not sure why, but typeName wasn't recognizing references to inner
- * annotations (e.g. @InterfaceName.InnerAnnotation())
- * Factored out the elementValue section of an annotation reference. Created
- * elementValuePair and elementValuePairs rules, then used them in the
- * annotation rule. Allows it to recognize annotation references with
- * multiple, comma separated attributes.
- * Updated elementValueArrayInitializer so that it allows multiple elements.
- * (It was only allowing 0 or 1 element).
- * Updated localVariableDeclaration to allow annotations. Interestingly the JLS
- * doesn't appear to indicate this is legal, but it does work as of at least
- * JDK 1.5.0_06.
- * Moved the Identifier portion of annotationTypeElementRest to annotationMethodRest.
- * Because annotationConstantRest already references variableDeclarator which
- * has the Identifier portion in it, the parser would fail on constants in
- * annotation definitions because it expected two identifiers.
- * Added optional trailing ';' to the alternatives in annotationTypeElementRest.
- * Wouldn't handle an inner interface that has a trailing ';'.
- * Swapped the expression and type rule reference order in castExpression to
- * make it check for genericized casts first. It was failing to recognize a
- * statement like "Class<Byte> TYPE = (Class<Byte>)...;" because it was seeing
- * 'Class<Byte' in the cast expression as a less than expression, then failing
- * on the '>'.
- * Changed createdName to use typeArguments instead of nonWildcardTypeArguments.
- *
- * Changed the 'this' alternative in primary to allow 'identifierSuffix' rather than
- * just 'arguments'. The case it couldn't handle was a call to an explicit
- * generic method invocation (e.g. this.<E>doSomething()). Using identifierSuffix
- * may be overly aggressive--perhaps should create a more constrained thisSuffix rule?
- *
- * Version 1.0.4 -- Hiroaki Nakamura, May 3, 2007
- *
- * Fixed formalParameterDecls, localVariableDeclaration, forInit,
- * and forVarControl to use variableModifier* not 'final'? (annotation)?
- *
- * Version 1.0.5 -- Terence, June 21, 2007
- * --a[i].foo didn't work. Fixed unaryExpression
- *
- * Version 1.0.6 -- John Ridgway, March 17, 2008
- * Made "assert" a switchable keyword like "enum".
- * Fixed compilationUnit to disallow "annotation importDeclaration ...".
- * Changed "Identifier ('.' Identifier)*" to "qualifiedName" in more
- * places.
- * Changed modifier* and/or variableModifier* to classOrInterfaceModifiers,
- * modifiers or variableModifiers, as appropriate.
- * Renamed "bound" to "typeBound" to better match language in the JLS.
- * Added "memberDeclaration" which rewrites to methodDeclaration or
- * fieldDeclaration and pulled type into memberDeclaration. So we parse
- * type and then move on to decide whether we're dealing with a field
- * or a method.
- * Modified "constructorDeclaration" to use "constructorBody" instead of
- * "methodBody". constructorBody starts with explicitConstructorInvocation,
- * then goes on to blockStatement*. Pulling explicitConstructorInvocation
- * out of expressions allowed me to simplify "primary".
- * Changed variableDeclarator to simplify it.
- * Changed type to use classOrInterfaceType, thus simplifying it; of course
- * I then had to add classOrInterfaceType, but it is used in several
- * places.
- * Fixed annotations, old version allowed "@X(y,z)", which is illegal.
- * Added optional comma to end of "elementValueArrayInitializer"; as per JLS.
- * Changed annotationTypeElementRest to use normalClassDeclaration and
- * normalInterfaceDeclaration rather than classDeclaration and
- * interfaceDeclaration, thus getting rid of a couple of grammar ambiguities.
- * Split localVariableDeclaration into localVariableDeclarationStatement
- * (includes the terminating semi-colon) and localVariableDeclaration.
- * This allowed me to use localVariableDeclaration in "forInit" clauses,
- * simplifying them.
- * Changed switchBlockStatementGroup to use multiple labels. This adds an
- * ambiguity, but if one uses appropriately greedy parsing it yields the
- * parse that is closest to the meaning of the switch statement.
- * Renamed "forVarControl" to "enhancedForControl" -- JLS language.
- * Added semantic predicates to test for shift operations rather than other
- * things. Thus, for instance, the string "< <" will never be treated
- * as a left-shift operator.
- * In "creator" we rule out "nonWildcardTypeArguments" on arrayCreation,
- * which are illegal.
- * Moved "nonWildcardTypeArguments into innerCreator.
- * Removed 'super' superSuffix from explicitGenericInvocation, since that
- * is only used in explicitConstructorInvocation at the beginning of a
- * constructorBody. (This is part of the simplification of expressions
- * mentioned earlier.)
- * Simplified primary (got rid of those things that are only used in
- * explicitConstructorInvocation).
- * Lexer -- removed "Exponent?" from FloatingPointLiteral choice 4, since it
- * led to an ambiguity.
- *
- * This grammar successfully parses every .java file in the JDK 1.5 source
- * tree (excluding those whose file names include '-', which are not
- * valid Java compilation units).
- *
- * Known remaining problems:
- * "Letter" and "JavaIDDigit" are wrong. The actual specification of
- * "Letter" should be "a character for which the method
- * Character.isJavaIdentifierStart(int) returns true." A "Java
- * letter-or-digit is a character for which the method
- * Character.isJavaIdentifierPart(int) returns true."
- */
-
-
- /*
- This is a merged file, containing two versions of the Java.g grammar.
- To extract a version from the file, run the ver.jar with the command provided below.
-
- Version 1 - tree building version, with all source level support, error recovery etc.
- This is the version for compiler grammar workspace.
- This version can be extracted by invoking:
- java -cp ver.jar Main 1 true true true true true Java.g
-
- Version 2 - clean version, with no source leve support, no error recovery, no predicts,
- assumes 1.6 level, works in Antlrworks.
- This is the version for Alex.
- This version can be extracted by invoking:
- java -cp ver.jar Main 2 false false false false false Java.g
-*/
-
-grammar Java;
-
-
-options {
- backtrack=true;
- memoize=true;
-}
-
-/********************************************************************************************
- Parser section
-*********************************************************************************************/
-
-compilationUnit
- : ( (annotations
- )?
- packageDeclaration
- )?
- (importDeclaration
- )*
- (typeDeclaration
- )*
- ;
-
-packageDeclaration
- : 'package' qualifiedName
- ';'
- ;
-
-importDeclaration
- : 'import'
- ('static'
- )?
- IDENTIFIER '.' '*'
- ';'
- | 'import'
- ('static'
- )?
- IDENTIFIER
- ('.' IDENTIFIER
- )+
- ('.' '*'
- )?
- ';'
- ;
-
-qualifiedImportName
- : IDENTIFIER
- ('.' IDENTIFIER
- )*
- ;
-
-typeDeclaration
- : classOrInterfaceDeclaration
- | ';'
- ;
-
-classOrInterfaceDeclaration
- : classDeclaration
- | interfaceDeclaration
- ;
-
-
-modifiers
- :
- ( annotation
- | 'public'
- | 'protected'
- | 'private'
- | 'static'
- | 'abstract'
- | 'final'
- | 'native'
- | 'synchronized'
- | 'transient'
- | 'volatile'
- | 'strictfp'
- )*
- ;
-
-
-variableModifiers
- : ( 'final'
- | annotation
- )*
- ;
-
-
-classDeclaration
- : normalClassDeclaration
- | enumDeclaration
- ;
-
-normalClassDeclaration
- : modifiers 'class' IDENTIFIER
- (typeParameters
- )?
- ('extends' type
- )?
- ('implements' typeList
- )?
- classBody
- ;
-
-
-typeParameters
- : '<'
- typeParameter
- (',' typeParameter
- )*
- '>'
- ;
-
-typeParameter
- : IDENTIFIER
- ('extends' typeBound
- )?
- ;
-
-
-typeBound
- : type
- ('&' type
- )*
- ;
-
-
-enumDeclaration
- : modifiers
- ('enum'
- )
- IDENTIFIER
- ('implements' typeList
- )?
- enumBody
- ;
-
-
-enumBody
- : '{'
- (enumConstants
- )?
- ','?
- (enumBodyDeclarations
- )?
- '}'
- ;
-
-enumConstants
- : enumConstant
- (',' enumConstant
- )*
- ;
-
-/**
- * NOTE: here differs from the javac grammar, missing TypeArguments.
- * EnumeratorDeclaration = AnnotationsOpt [TypeArguments] IDENTIFIER [ Arguments ] [ "{" ClassBody "}" ]
- */
-enumConstant
- : (annotations
- )?
- IDENTIFIER
- (arguments
- )?
- (classBody
- )?
- /* TODO: $GScope::name = names.empty. enum constant body is actually
- an anonymous class, where constructor isn't allowed, have to add this check*/
- ;
-
-enumBodyDeclarations
- : ';'
- (classBodyDeclaration
- )*
- ;
-
-interfaceDeclaration
- : normalInterfaceDeclaration
- | annotationTypeDeclaration
- ;
-
-normalInterfaceDeclaration
- : modifiers 'interface' IDENTIFIER
- (typeParameters
- )?
- ('extends' typeList
- )?
- interfaceBody
- ;
-
-typeList
- : type
- (',' type
- )*
- ;
-
-classBody
- : '{'
- (classBodyDeclaration
- )*
- '}'
- ;
-
-interfaceBody
- : '{'
- (interfaceBodyDeclaration
- )*
- '}'
- ;
-
-classBodyDeclaration
- : ';'
- | ('static'
- )?
- block
- | memberDecl
- ;
-
-memberDecl
- : fieldDeclaration
- | methodDeclaration
- | classDeclaration
- | interfaceDeclaration
- ;
-
-
-methodDeclaration
- :
- /* For constructor, return type is null, name is 'init' */
- modifiers
- (typeParameters
- )?
- IDENTIFIER
- formalParameters
- ('throws' qualifiedNameList
- )?
- '{'
- (explicitConstructorInvocation
- )?
- (blockStatement
- )*
- '}'
- | modifiers
- (typeParameters
- )?
- (type
- | 'void'
- )
- IDENTIFIER
- formalParameters
- ('[' ']'
- )*
- ('throws' qualifiedNameList
- )?
- (
- block
- | ';'
- )
- ;
-
-
-fieldDeclaration
- : modifiers
- type
- variableDeclarator
- (',' variableDeclarator
- )*
- ';'
- ;
-
-variableDeclarator
- : IDENTIFIER
- ('[' ']'
- )*
- ('=' variableInitializer
- )?
- ;
-
-/**
- *TODO: add predicates
- */
-interfaceBodyDeclaration
- :
- interfaceFieldDeclaration
- | interfaceMethodDeclaration
- | interfaceDeclaration
- | classDeclaration
- | ';'
- ;
-
-interfaceMethodDeclaration
- : modifiers
- (typeParameters
- )?
- (type
- |'void'
- )
- IDENTIFIER
- formalParameters
- ('[' ']'
- )*
- ('throws' qualifiedNameList
- )? ';'
- ;
-
-/**
- * NOTE, should not use variableDeclarator here, as it doesn't necessary require
- * an initializer, while an interface field does, or judge by the returned value.
- * But this gives better diagnostic message, or antlr won't predict this rule.
- */
-interfaceFieldDeclaration
- : modifiers type variableDeclarator
- (',' variableDeclarator
- )*
- ';'
- ;
-
-
-type
- : classOrInterfaceType
- ('[' ']'
- )*
- | primitiveType
- ('[' ']'
- )*
- ;
-
-
-classOrInterfaceType
- : IDENTIFIER
- (typeArguments
- )?
- ('.' IDENTIFIER
- (typeArguments
- )?
- )*
- ;
-
-primitiveType
- : 'boolean'
- | 'char'
- | 'byte'
- | 'short'
- | 'int'
- | 'long'
- | 'float'
- | 'double'
- ;
-
-typeArguments
- : '<' typeArgument
- (',' typeArgument
- )*
- '>'
- ;
-
-typeArgument
- : type
- | '?'
- (
- ('extends'
- |'super'
- )
- type
- )?
- ;
-
-qualifiedNameList
- : qualifiedName
- (',' qualifiedName
- )*
- ;
-
-formalParameters
- : '('
- (formalParameterDecls
- )?
- ')'
- ;
-
-formalParameterDecls
- : ellipsisParameterDecl
- | normalParameterDecl
- (',' normalParameterDecl
- )*
- | (normalParameterDecl
- ','
- )+
- ellipsisParameterDecl
- ;
-
-normalParameterDecl
- : variableModifiers type IDENTIFIER
- ('[' ']'
- )*
- ;
-
-ellipsisParameterDecl
- : variableModifiers
- type '...'
- IDENTIFIER
- ;
-
-
-explicitConstructorInvocation
- : (nonWildcardTypeArguments
- )? //NOTE: the position of Identifier 'super' is set to the type args position here
- ('this'
- |'super'
- )
- arguments ';'
-
- | primary
- '.'
- (nonWildcardTypeArguments
- )?
- 'super'
- arguments ';'
- ;
-
-qualifiedName
- : IDENTIFIER
- ('.' IDENTIFIER
- )*
- ;
-
-annotations
- : (annotation
- )+
- ;
-
-/**
- * Using an annotation.
- * '@' is flaged in modifier
- */
-annotation
- : '@' qualifiedName
- ( '('
- ( elementValuePairs
- | elementValue
- )?
- ')'
- )?
- ;
-
-elementValuePairs
- : elementValuePair
- (',' elementValuePair
- )*
- ;
-
-elementValuePair
- : IDENTIFIER '=' elementValue
- ;
-
-elementValue
- : conditionalExpression
- | annotation
- | elementValueArrayInitializer
- ;
-
-elementValueArrayInitializer
- : '{'
- (elementValue
- (',' elementValue
- )*
- )? (',')? '}'
- ;
-
-
-/**
- * Annotation declaration.
- */
-annotationTypeDeclaration
- : modifiers '@'
- 'interface'
- IDENTIFIER
- annotationTypeBody
- ;
-
-
-annotationTypeBody
- : '{'
- (annotationTypeElementDeclaration
- )*
- '}'
- ;
-
-/**
- * NOTE: here use interfaceFieldDeclaration for field declared inside annotation. they are sytactically the same.
- */
-annotationTypeElementDeclaration
- : annotationMethodDeclaration
- | interfaceFieldDeclaration
- | normalClassDeclaration
- | normalInterfaceDeclaration
- | enumDeclaration
- | annotationTypeDeclaration
- | ';'
- ;
-
-annotationMethodDeclaration
- : modifiers type IDENTIFIER
- '(' ')' ('default' elementValue
- )?
- ';'
- ;
-
-block
- : '{'
- (blockStatement
- )*
- '}'
- ;
-
-/*
-staticBlock returns [JCBlock tree]
- @init {
- ListBuffer<JCStatement> stats = new ListBuffer<JCStatement>();
- int pos = ((AntlrJavacToken) $start).getStartIndex();
- }
- @after {
- $tree = T.at(pos).Block(Flags.STATIC, stats.toList());
- pu.storeEnd($tree, $stop);
- // construct a dummy static modifiers for end position
- pu.storeEnd(T.at(pos).Modifiers(Flags.STATIC, com.sun.tools.javac.util.List.<JCAnnotation>nil()),$st);
- }
- : st_1='static' '{'
- (blockStatement
- {
- if ($blockStatement.tree == null) {
- stats.appendList($blockStatement.list);
- } else {
- stats.append($blockStatement.tree);
- }
- }
- )* '}'
- ;
-*/
-blockStatement
- : localVariableDeclarationStatement
- | classOrInterfaceDeclaration
- | statement
- ;
-
-
-localVariableDeclarationStatement
- : localVariableDeclaration
- ';'
- ;
-
-localVariableDeclaration
- : variableModifiers type
- variableDeclarator
- (',' variableDeclarator
- )*
- ;
-
-statement
- : block
-
- | ('assert'
- )
- expression (':' expression)? ';'
- | 'assert' expression (':' expression)? ';'
- | 'if' parExpression statement ('else' statement)?
- | forstatement
- | 'while' parExpression statement
- | 'do' statement 'while' parExpression ';'
- | trystatement
- | 'switch' parExpression '{' switchBlockStatementGroups '}'
- | 'synchronized' parExpression block
- | 'return' (expression )? ';'
- | 'throw' expression ';'
- | 'break'
- (IDENTIFIER
- )? ';'
- | 'continue'
- (IDENTIFIER
- )? ';'
- | expression ';'
- | IDENTIFIER ':' statement
- | ';'
-
- ;
-
-switchBlockStatementGroups
- : (switchBlockStatementGroup )*
- ;
-
-switchBlockStatementGroup
- :
- switchLabel
- (blockStatement
- )*
- ;
-
-switchLabel
- : 'case' expression ':'
- | 'default' ':'
- ;
-
-
-trystatement
- : 'try' block
- ( catches 'finally' block
- | catches
- | 'finally' block
- )
- ;
-
-catches
- : catchClause
- (catchClause
- )*
- ;
-
-catchClause
- : 'catch' '(' formalParameter
- ')' block
- ;
-
-formalParameter
- : variableModifiers type IDENTIFIER
- ('[' ']'
- )*
- ;
-
-forstatement
- :
- // enhanced for loop
- 'for' '(' variableModifiers type IDENTIFIER ':'
- expression ')' statement
-
- // normal for loop
- | 'for' '('
- (forInit
- )? ';'
- (expression
- )? ';'
- (expressionList
- )? ')' statement
- ;
-
-forInit
- : localVariableDeclaration
- | expressionList
- ;
-
-parExpression
- : '(' expression ')'
- ;
-
-expressionList
- : expression
- (',' expression
- )*
- ;
-
-
-expression
- : conditionalExpression
- (assignmentOperator expression
- )?
- ;
-
-
-assignmentOperator
- : '='
- | '+='
- | '-='
- | '*='
- | '/='
- | '&='
- | '|='
- | '^='
- | '%='
- | '<' '<' '='
- | '>' '>' '>' '='
- | '>' '>' '='
- ;
-
-
-conditionalExpression
- : conditionalOrExpression
- ('?' expression ':' conditionalExpression
- )?
- ;
-
-conditionalOrExpression
- : conditionalAndExpression
- ('||' conditionalAndExpression
- )*
- ;
-
-conditionalAndExpression
- : inclusiveOrExpression
- ('&&' inclusiveOrExpression
- )*
- ;
-
-inclusiveOrExpression
- : exclusiveOrExpression
- ('|' exclusiveOrExpression
- )*
- ;
-
-exclusiveOrExpression
- : andExpression
- ('^' andExpression
- )*
- ;
-
-andExpression
- : equalityExpression
- ('&' equalityExpression
- )*
- ;
-
-equalityExpression
- : instanceOfExpression
- (
- ( '=='
- | '!='
- )
- instanceOfExpression
- )*
- ;
-
-instanceOfExpression
- : relationalExpression
- ('instanceof' type
- )?
- ;
-
-relationalExpression
- : shiftExpression
- (relationalOp shiftExpression
- )*
- ;
-
-relationalOp
- : '<' '='
- | '>' '='
- | '<'
- | '>'
- ;
-
-shiftExpression
- : additiveExpression
- (shiftOp additiveExpression
- )*
- ;
-
-
-shiftOp
- : '<' '<'
- | '>' '>' '>'
- | '>' '>'
- ;
-
-
-additiveExpression
- : multiplicativeExpression
- (
- ( '+'
- | '-'
- )
- multiplicativeExpression
- )*
- ;
-
-multiplicativeExpression
- :
- unaryExpression
- (
- ( '*'
- | '/'
- | '%'
- )
- unaryExpression
- )*
- ;
-
-/**
- * NOTE: for '+' and '-', if the next token is int or long interal, then it's not a unary expression.
- * it's a literal with signed value. INTLTERAL AND LONG LITERAL are added here for this.
- */
-unaryExpression
- : '+' unaryExpression
- | '-' unaryExpression
- | '++' unaryExpression
- | '--' unaryExpression
- | unaryExpressionNotPlusMinus
- ;
-
-unaryExpressionNotPlusMinus
- : '~' unaryExpression
- | '!' unaryExpression
- | castExpression
- | primary
- (selector
- )*
- ( '++'
- | '--'
- )?
- ;
-
-castExpression
- : '(' primitiveType ')' unaryExpression
- | '(' type ')' unaryExpressionNotPlusMinus
- ;
-
-/**
- * have to use scope here, parameter passing isn't well supported in antlr.
- */
-primary
- : parExpression
- | 'this'
- ('.' IDENTIFIER
- )*
- (identifierSuffix
- )?
- | IDENTIFIER
- ('.' IDENTIFIER
- )*
- (identifierSuffix
- )?
- | 'super'
- superSuffix
- | literal
- | creator
- | primitiveType
- ('[' ']'
- )*
- '.' 'class'
- | 'void' '.' 'class'
- ;
-
-
-superSuffix
- : arguments
- | '.' (typeArguments
- )?
- IDENTIFIER
- (arguments
- )?
- ;
-
-
-identifierSuffix
- : ('[' ']'
- )+
- '.' 'class'
- | ('[' expression ']'
- )+
- | arguments
- | '.' 'class'
- | '.' nonWildcardTypeArguments IDENTIFIER arguments
- | '.' 'this'
- | '.' 'super' arguments
- | innerCreator
- ;
-
-
-selector
- : '.' IDENTIFIER
- (arguments
- )?
- | '.' 'this'
- | '.' 'super'
- superSuffix
- | innerCreator
- | '[' expression ']'
- ;
-
-creator
- : 'new' nonWildcardTypeArguments classOrInterfaceType classCreatorRest
- | 'new' classOrInterfaceType classCreatorRest
- | arrayCreator
- ;
-
-arrayCreator
- : 'new' createdName
- '[' ']'
- ('[' ']'
- )*
- arrayInitializer
-
- | 'new' createdName
- '[' expression
- ']'
- ( '[' expression
- ']'
- )*
- ('[' ']'
- )*
- ;
-
-variableInitializer
- : arrayInitializer
- | expression
- ;
-
-arrayInitializer
- : '{'
- (variableInitializer
- (',' variableInitializer
- )*
- )?
- (',')?
- '}' //Yang's fix, position change.
- ;
-
-
-createdName
- : classOrInterfaceType
- | primitiveType
- ;
-
-innerCreator
- : '.' 'new'
- (nonWildcardTypeArguments
- )?
- IDENTIFIER
- (typeArguments
- )?
- classCreatorRest
- ;
-
-
-classCreatorRest
- : arguments
- (classBody
- )?
- ;
-
-
-nonWildcardTypeArguments
- : '<' typeList
- '>'
- ;
-
-arguments
- : '(' (expressionList
- )? ')'
- ;
-
-literal
- : INTLITERAL
- | LONGLITERAL
- | FLOATLITERAL
- | DOUBLELITERAL
- | CHARLITERAL
- | STRINGLITERAL
- | TRUE
- | FALSE
- | NULL
- ;
-
-/**
- * These are headers help to make syntatical predicates, not necessary but helps to make grammar faster.
- */
-
-classHeader
- : modifiers 'class' IDENTIFIER
- ;
-
-enumHeader
- : modifiers ('enum'|IDENTIFIER) IDENTIFIER
- ;
-
-interfaceHeader
- : modifiers 'interface' IDENTIFIER
- ;
-
-annotationHeader
- : modifiers '@' 'interface' IDENTIFIER
- ;
-
-typeHeader
- : modifiers ('class'|'enum'|('@' ? 'interface')) IDENTIFIER
- ;
-
-methodHeader
- : modifiers typeParameters? (type|'void')? IDENTIFIER '('
- ;
-
-fieldHeader
- : modifiers type IDENTIFIER ('['']')* ('='|','|';')
- ;
-
-localVariableHeader
- : variableModifiers type IDENTIFIER ('['']')* ('='|','|';')
- ;
-
-
-
-
-/********************************************************************************************
- Lexer section
-*********************************************************************************************/
-
-LONGLITERAL
- : IntegerNumber LongSuffix
- ;
-
-
-INTLITERAL
- : IntegerNumber
- ;
-
-fragment
-IntegerNumber
- : '0'
- | '1'..'9' ('0'..'9')*
- | '0' ('0'..'7')+
- | HexPrefix HexDigit+
- ;
-
-fragment
-HexPrefix
- : '0x' | '0X'
- ;
-
-fragment
-HexDigit
- : ('0'..'9'|'a'..'f'|'A'..'F')
- ;
-
-fragment
-LongSuffix
- : 'l' | 'L'
- ;
-
-
-fragment
-NonIntegerNumber
- : ('0' .. '9')+ '.' ('0' .. '9')* Exponent?
- | '.' ( '0' .. '9' )+ Exponent?
- | ('0' .. '9')+ Exponent
- | ('0' .. '9')+
- |
- HexPrefix (HexDigit )*
- ( ()
- | ('.' (HexDigit )* )
- )
- ( 'p' | 'P' )
- ( '+' | '-' )?
- ( '0' .. '9' )+
- ;
-
-fragment
-Exponent
- : ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+
- ;
-
-fragment
-FloatSuffix
- : 'f' | 'F'
- ;
-
-fragment
-DoubleSuffix
- : 'd' | 'D'
- ;
-
-FLOATLITERAL
- : NonIntegerNumber FloatSuffix
- ;
-
-DOUBLELITERAL
- : NonIntegerNumber DoubleSuffix?
- ;
-
-CHARLITERAL
- : '\''
- ( EscapeSequence
- | ~( '\'' | '\\' | '\r' | '\n' )
- )
- '\''
- ;
-
-STRINGLITERAL
- : '"'
- ( EscapeSequence
- | ~( '\\' | '"' | '\r' | '\n' )
- )*
- '"'
- ;
-
-fragment
-EscapeSequence
- : '\\' (
- 'b'
- | 't'
- | 'n'
- | 'f'
- | 'r'
- | '\"'
- | '\''
- | '\\'
- |
- ('0'..'3') ('0'..'7') ('0'..'7')
- |
- ('0'..'7') ('0'..'7')
- |
- ('0'..'7')
- )
-;
-
-WS
- : (
- ' '
- | '\r'
- | '\t'
- | '\u000C'
- | '\n'
- )
- {
- skip();
- }
- ;
-
-COMMENT
- @init{
- boolean isJavaDoc = false;
- }
- : '/*'
- {
- if((char)input.LA(1) == '*'){
- isJavaDoc = true;
- }
- }
- (options {greedy=false;} : . )*
- '*/'
- {
- if(isJavaDoc==true){
- $channel=HIDDEN;
- }else{
- skip();
- }
- }
- ;
-
-LINE_COMMENT
- : '//' ~('\n'|'\r')* ('\r\n' | '\r' | '\n')
- {
- skip();
- }
- | '//' ~('\n'|'\r')* // a line comment could appear at the end of the file without CR/LF
- {
- skip();
- }
- ;
-
-ABSTRACT
- : 'abstract'
- ;
-
-ASSERT
- : 'assert'
- ;
-
-BOOLEAN
- : 'boolean'
- ;
-
-BREAK
- : 'break'
- ;
-
-BYTE
- : 'byte'
- ;
-
-CASE
- : 'case'
- ;
-
-CATCH
- : 'catch'
- ;
-
-CHAR
- : 'char'
- ;
-
-CLASS
- : 'class'
- ;
-
-CONST
- : 'const'
- ;
-
-CONTINUE
- : 'continue'
- ;
-
-DEFAULT
- : 'default'
- ;
-
-DO
- : 'do'
- ;
-
-DOUBLE
- : 'double'
- ;
-
-ELSE
- : 'else'
- ;
-
-ENUM
- : 'enum'
- ;
-
-EXTENDS
- : 'extends'
- ;
-
-FINAL
- : 'final'
- ;
-
-FINALLY
- : 'finally'
- ;
-
-FLOAT
- : 'float'
- ;
-
-FOR
- : 'for'
- ;
-
-GOTO
- : 'goto'
- ;
-
-IF
- : 'if'
- ;
-
-IMPLEMENTS
- : 'implements'
- ;
-
-IMPORT
- : 'import'
- ;
-
-INSTANCEOF
- : 'instanceof'
- ;
-
-INT
- : 'int'
- ;
-
-INTERFACE
- : 'interface'
- ;
-
-LONG
- : 'long'
- ;
-
-NATIVE
- : 'native'
- ;
-
-NEW
- : 'new'
- ;
-
-PACKAGE
- : 'package'
- ;
-
-PRIVATE
- : 'private'
- ;
-
-PROTECTED
- : 'protected'
- ;
-
-PUBLIC
- : 'public'
- ;
-
-RETURN
- : 'return'
- ;
-
-SHORT
- : 'short'
- ;
-
-STATIC
- : 'static'
- ;
-
-STRICTFP
- : 'strictfp'
- ;
-
-SUPER
- : 'super'
- ;
-
-SWITCH
- : 'switch'
- ;
-
-SYNCHRONIZED
- : 'synchronized'
- ;
-
-THIS
- : 'this'
- ;
-
-THROW
- : 'throw'
- ;
-
-THROWS
- : 'throws'
- ;
-
-TRANSIENT
- : 'transient'
- ;
-
-TRY
- : 'try'
- ;
-
-VOID
- : 'void'
- ;
-
-VOLATILE
- : 'volatile'
- ;
-
-WHILE
- : 'while'
- ;
-
-TRUE
- : 'true'
- ;
-
-FALSE
- : 'false'
- ;
-
-NULL
- : 'null'
- ;
-
-LPAREN
- : '('
- ;
-
-RPAREN
- : ')'
- ;
-
-LBRACE
- : '{'
- ;
-
-RBRACE
- : '}'
- ;
-
-LBRACKET
- : '['
- ;
-
-RBRACKET
- : ']'
- ;
-
-SEMI
- : ';'
- ;
-
-COMMA
- : ','
- ;
-
-DOT
- : '.'
- ;
-
-ELLIPSIS
- : '...'
- ;
-
-EQ
- : '='
- ;
-
-BANG
- : '!'
- ;
-
-TILDE
- : '~'
- ;
-
-QUES
- : '?'
- ;
-
-COLON
- : ':'
- ;
-
-EQEQ
- : '=='
- ;
-
-AMPAMP
- : '&&'
- ;
-
-BARBAR
- : '||'
- ;
-
-PLUSPLUS
- : '++'
- ;
-
-SUBSUB
- : '--'
- ;
-
-PLUS
- : '+'
- ;
-
-SUB
- : '-'
- ;
-
-STAR
- : '*'
- ;
-
-SLASH
- : '/'
- ;
-
-AMP
- : '&'
- ;
-
-BAR
- : '|'
- ;
-
-CARET
- : '^'
- ;
-
-PERCENT
- : '%'
- ;
-
-PLUSEQ
- : '+='
- ;
-
-SUBEQ
- : '-='
- ;
-
-STAREQ
- : '*='
- ;
-
-SLASHEQ
- : '/='
- ;
-
-AMPEQ
- : '&='
- ;
-
-BAREQ
- : '|='
- ;
-
-CARETEQ
- : '^='
- ;
-
-PERCENTEQ
- : '%='
- ;
-
-MONKEYS_AT
- : '@'
- ;
-
-BANGEQ
- : '!='
- ;
-
-GT
- : '>'
- ;
-
-LT
- : '<'
- ;
-
-IDENTIFIER
- : IdentifierStart IdentifierPart*
- ;
-
-fragment
-SurrogateIdentifer
- : ('\ud800'..'\udbff') ('\udc00'..'\udfff')
- ;
-
-fragment
-IdentifierStart
- : '\u0024'
- | '\u0041'..'\u005a'
- | '\u005f'
- | '\u0061'..'\u007a'
- | '\u00a2'..'\u00a5'
- | '\u00aa'
- | '\u00b5'
- | '\u00ba'
- | '\u00c0'..'\u00d6'
- | '\u00d8'..'\u00f6'
- | '\u00f8'..'\u0236'
- | '\u0250'..'\u02c1'
- | '\u02c6'..'\u02d1'
- | '\u02e0'..'\u02e4'
- | '\u02ee'
- | '\u037a'
- | '\u0386'
- | '\u0388'..'\u038a'
- | '\u038c'
- | '\u038e'..'\u03a1'
- | '\u03a3'..'\u03ce'
- | '\u03d0'..'\u03f5'
- | '\u03f7'..'\u03fb'
- | '\u0400'..'\u0481'
- | '\u048a'..'\u04ce'
- | '\u04d0'..'\u04f5'
- | '\u04f8'..'\u04f9'
- | '\u0500'..'\u050f'
- | '\u0531'..'\u0556'
- | '\u0559'
- | '\u0561'..'\u0587'
- | '\u05d0'..'\u05ea'
- | '\u05f0'..'\u05f2'
- | '\u0621'..'\u063a'
- | '\u0640'..'\u064a'
- | '\u066e'..'\u066f'
- | '\u0671'..'\u06d3'
- | '\u06d5'
- | '\u06e5'..'\u06e6'
- | '\u06ee'..'\u06ef'
- | '\u06fa'..'\u06fc'
- | '\u06ff'
- | '\u0710'
- | '\u0712'..'\u072f'
- | '\u074d'..'\u074f'
- | '\u0780'..'\u07a5'
- | '\u07b1'
- | '\u0904'..'\u0939'
- | '\u093d'
- | '\u0950'
- | '\u0958'..'\u0961'
- | '\u0985'..'\u098c'
- | '\u098f'..'\u0990'
- | '\u0993'..'\u09a8'
- | '\u09aa'..'\u09b0'
- | '\u09b2'
- | '\u09b6'..'\u09b9'
- | '\u09bd'
- | '\u09dc'..'\u09dd'
- | '\u09df'..'\u09e1'
- | '\u09f0'..'\u09f3'
- | '\u0a05'..'\u0a0a'
- | '\u0a0f'..'\u0a10'
- | '\u0a13'..'\u0a28'
- | '\u0a2a'..'\u0a30'
- | '\u0a32'..'\u0a33'
- | '\u0a35'..'\u0a36'
- | '\u0a38'..'\u0a39'
- | '\u0a59'..'\u0a5c'
- | '\u0a5e'
- | '\u0a72'..'\u0a74'
- | '\u0a85'..'\u0a8d'
- | '\u0a8f'..'\u0a91'
- | '\u0a93'..'\u0aa8'
- | '\u0aaa'..'\u0ab0'
- | '\u0ab2'..'\u0ab3'
- | '\u0ab5'..'\u0ab9'
- | '\u0abd'
- | '\u0ad0'
- | '\u0ae0'..'\u0ae1'
- | '\u0af1'
- | '\u0b05'..'\u0b0c'
- | '\u0b0f'..'\u0b10'
- | '\u0b13'..'\u0b28'
- | '\u0b2a'..'\u0b30'
- | '\u0b32'..'\u0b33'
- | '\u0b35'..'\u0b39'
- | '\u0b3d'
- | '\u0b5c'..'\u0b5d'
- | '\u0b5f'..'\u0b61'
- | '\u0b71'
- | '\u0b83'
- | '\u0b85'..'\u0b8a'
- | '\u0b8e'..'\u0b90'
- | '\u0b92'..'\u0b95'
- | '\u0b99'..'\u0b9a'
- | '\u0b9c'
- | '\u0b9e'..'\u0b9f'
- | '\u0ba3'..'\u0ba4'
- | '\u0ba8'..'\u0baa'
- | '\u0bae'..'\u0bb5'
- | '\u0bb7'..'\u0bb9'
- | '\u0bf9'
- | '\u0c05'..'\u0c0c'
- | '\u0c0e'..'\u0c10'
- | '\u0c12'..'\u0c28'
- | '\u0c2a'..'\u0c33'
- | '\u0c35'..'\u0c39'
- | '\u0c60'..'\u0c61'
- | '\u0c85'..'\u0c8c'
- | '\u0c8e'..'\u0c90'
- | '\u0c92'..'\u0ca8'
- | '\u0caa'..'\u0cb3'
- | '\u0cb5'..'\u0cb9'
- | '\u0cbd'
- | '\u0cde'
- | '\u0ce0'..'\u0ce1'
- | '\u0d05'..'\u0d0c'
- | '\u0d0e'..'\u0d10'
- | '\u0d12'..'\u0d28'
- | '\u0d2a'..'\u0d39'
- | '\u0d60'..'\u0d61'
- | '\u0d85'..'\u0d96'
- | '\u0d9a'..'\u0db1'
- | '\u0db3'..'\u0dbb'
- | '\u0dbd'
- | '\u0dc0'..'\u0dc6'
- | '\u0e01'..'\u0e30'
- | '\u0e32'..'\u0e33'
- | '\u0e3f'..'\u0e46'
- | '\u0e81'..'\u0e82'
- | '\u0e84'
- | '\u0e87'..'\u0e88'
- | '\u0e8a'
- | '\u0e8d'
- | '\u0e94'..'\u0e97'
- | '\u0e99'..'\u0e9f'
- | '\u0ea1'..'\u0ea3'
- | '\u0ea5'
- | '\u0ea7'
- | '\u0eaa'..'\u0eab'
- | '\u0ead'..'\u0eb0'
- | '\u0eb2'..'\u0eb3'
- | '\u0ebd'
- | '\u0ec0'..'\u0ec4'
- | '\u0ec6'
- | '\u0edc'..'\u0edd'
- | '\u0f00'
- | '\u0f40'..'\u0f47'
- | '\u0f49'..'\u0f6a'
- | '\u0f88'..'\u0f8b'
- | '\u1000'..'\u1021'
- | '\u1023'..'\u1027'
- | '\u1029'..'\u102a'
- | '\u1050'..'\u1055'
- | '\u10a0'..'\u10c5'
- | '\u10d0'..'\u10f8'
- | '\u1100'..'\u1159'
- | '\u115f'..'\u11a2'
- | '\u11a8'..'\u11f9'
- | '\u1200'..'\u1206'
- | '\u1208'..'\u1246'
- | '\u1248'
- | '\u124a'..'\u124d'
- | '\u1250'..'\u1256'
- | '\u1258'
- | '\u125a'..'\u125d'
- | '\u1260'..'\u1286'
- | '\u1288'
- | '\u128a'..'\u128d'
- | '\u1290'..'\u12ae'
- | '\u12b0'
- | '\u12b2'..'\u12b5'
- | '\u12b8'..'\u12be'
- | '\u12c0'
- | '\u12c2'..'\u12c5'
- | '\u12c8'..'\u12ce'
- | '\u12d0'..'\u12d6'
- | '\u12d8'..'\u12ee'
- | '\u12f0'..'\u130e'
- | '\u1310'
- | '\u1312'..'\u1315'
- | '\u1318'..'\u131e'
- | '\u1320'..'\u1346'
- | '\u1348'..'\u135a'
- | '\u13a0'..'\u13f4'
- | '\u1401'..'\u166c'
- | '\u166f'..'\u1676'
- | '\u1681'..'\u169a'
- | '\u16a0'..'\u16ea'
- | '\u16ee'..'\u16f0'
- | '\u1700'..'\u170c'
- | '\u170e'..'\u1711'
- | '\u1720'..'\u1731'
- | '\u1740'..'\u1751'
- | '\u1760'..'\u176c'
- | '\u176e'..'\u1770'
- | '\u1780'..'\u17b3'
- | '\u17d7'
- | '\u17db'..'\u17dc'
- | '\u1820'..'\u1877'
- | '\u1880'..'\u18a8'
- | '\u1900'..'\u191c'
- | '\u1950'..'\u196d'
- | '\u1970'..'\u1974'
- | '\u1d00'..'\u1d6b'
- | '\u1e00'..'\u1e9b'
- | '\u1ea0'..'\u1ef9'
- | '\u1f00'..'\u1f15'
- | '\u1f18'..'\u1f1d'
- | '\u1f20'..'\u1f45'
- | '\u1f48'..'\u1f4d'
- | '\u1f50'..'\u1f57'
- | '\u1f59'
- | '\u1f5b'
- | '\u1f5d'
- | '\u1f5f'..'\u1f7d'
- | '\u1f80'..'\u1fb4'
- | '\u1fb6'..'\u1fbc'
- | '\u1fbe'
- | '\u1fc2'..'\u1fc4'
- | '\u1fc6'..'\u1fcc'
- | '\u1fd0'..'\u1fd3'
- | '\u1fd6'..'\u1fdb'
- | '\u1fe0'..'\u1fec'
- | '\u1ff2'..'\u1ff4'
- | '\u1ff6'..'\u1ffc'
- | '\u203f'..'\u2040'
- | '\u2054'
- | '\u2071'
- | '\u207f'
- | '\u20a0'..'\u20b1'
- | '\u2102'
- | '\u2107'
- | '\u210a'..'\u2113'
- | '\u2115'
- | '\u2119'..'\u211d'
- | '\u2124'
- | '\u2126'
- | '\u2128'
- | '\u212a'..'\u212d'
- | '\u212f'..'\u2131'
- | '\u2133'..'\u2139'
- | '\u213d'..'\u213f'
- | '\u2145'..'\u2149'
- | '\u2160'..'\u2183'
- | '\u3005'..'\u3007'
- | '\u3021'..'\u3029'
- | '\u3031'..'\u3035'
- | '\u3038'..'\u303c'
- | '\u3041'..'\u3096'
- | '\u309d'..'\u309f'
- | '\u30a1'..'\u30ff'
- | '\u3105'..'\u312c'
- | '\u3131'..'\u318e'
- | '\u31a0'..'\u31b7'
- | '\u31f0'..'\u31ff'
- | '\u3400'..'\u4db5'
- | '\u4e00'..'\u9fa5'
- | '\ua000'..'\ua48c'
- | '\uac00'..'\ud7a3'
- | '\uf900'..'\ufa2d'
- | '\ufa30'..'\ufa6a'
- | '\ufb00'..'\ufb06'
- | '\ufb13'..'\ufb17'
- | '\ufb1d'
- | '\ufb1f'..'\ufb28'
- | '\ufb2a'..'\ufb36'
- | '\ufb38'..'\ufb3c'
- | '\ufb3e'
- | '\ufb40'..'\ufb41'
- | '\ufb43'..'\ufb44'
- | '\ufb46'..'\ufbb1'
- | '\ufbd3'..'\ufd3d'
- | '\ufd50'..'\ufd8f'
- | '\ufd92'..'\ufdc7'
- | '\ufdf0'..'\ufdfc'
- | '\ufe33'..'\ufe34'
- | '\ufe4d'..'\ufe4f'
- | '\ufe69'
- | '\ufe70'..'\ufe74'
- | '\ufe76'..'\ufefc'
- | '\uff04'
- | '\uff21'..'\uff3a'
- | '\uff3f'
- | '\uff41'..'\uff5a'
- | '\uff65'..'\uffbe'
- | '\uffc2'..'\uffc7'
- | '\uffca'..'\uffcf'
- | '\uffd2'..'\uffd7'
- | '\uffda'..'\uffdc'
- | '\uffe0'..'\uffe1'
- | '\uffe5'..'\uffe6'
- | ('\ud800'..'\udbff') ('\udc00'..'\udfff')
- ;
-
-fragment
-IdentifierPart
- : '\u0000'..'\u0008'
- | '\u000e'..'\u001b'
- | '\u0024'
- | '\u0030'..'\u0039'
- | '\u0041'..'\u005a'
- | '\u005f'
- | '\u0061'..'\u007a'
- | '\u007f'..'\u009f'
- | '\u00a2'..'\u00a5'
- | '\u00aa'
- | '\u00ad'
- | '\u00b5'
- | '\u00ba'
- | '\u00c0'..'\u00d6'
- | '\u00d8'..'\u00f6'
- | '\u00f8'..'\u0236'
- | '\u0250'..'\u02c1'
- | '\u02c6'..'\u02d1'
- | '\u02e0'..'\u02e4'
- | '\u02ee'
- | '\u0300'..'\u0357'
- | '\u035d'..'\u036f'
- | '\u037a'
- | '\u0386'
- | '\u0388'..'\u038a'
- | '\u038c'
- | '\u038e'..'\u03a1'
- | '\u03a3'..'\u03ce'
- | '\u03d0'..'\u03f5'
- | '\u03f7'..'\u03fb'
- | '\u0400'..'\u0481'
- | '\u0483'..'\u0486'
- | '\u048a'..'\u04ce'
- | '\u04d0'..'\u04f5'
- | '\u04f8'..'\u04f9'
- | '\u0500'..'\u050f'
- | '\u0531'..'\u0556'
- | '\u0559'
- | '\u0561'..'\u0587'
- | '\u0591'..'\u05a1'
- | '\u05a3'..'\u05b9'
- | '\u05bb'..'\u05bd'
- | '\u05bf'
- | '\u05c1'..'\u05c2'
- | '\u05c4'
- | '\u05d0'..'\u05ea'
- | '\u05f0'..'\u05f2'
- | '\u0600'..'\u0603'
- | '\u0610'..'\u0615'
- | '\u0621'..'\u063a'
- | '\u0640'..'\u0658'
- | '\u0660'..'\u0669'
- | '\u066e'..'\u06d3'
- | '\u06d5'..'\u06dd'
- | '\u06df'..'\u06e8'
- | '\u06ea'..'\u06fc'
- | '\u06ff'
- | '\u070f'..'\u074a'
- | '\u074d'..'\u074f'
- | '\u0780'..'\u07b1'
- | '\u0901'..'\u0939'
- | '\u093c'..'\u094d'
- | '\u0950'..'\u0954'
- | '\u0958'..'\u0963'
- | '\u0966'..'\u096f'
- | '\u0981'..'\u0983'
- | '\u0985'..'\u098c'
- | '\u098f'..'\u0990'
- | '\u0993'..'\u09a8'
- | '\u09aa'..'\u09b0'
- | '\u09b2'
- | '\u09b6'..'\u09b9'
- | '\u09bc'..'\u09c4'
- | '\u09c7'..'\u09c8'
- | '\u09cb'..'\u09cd'
- | '\u09d7'
- | '\u09dc'..'\u09dd'
- | '\u09df'..'\u09e3'
- | '\u09e6'..'\u09f3'
- | '\u0a01'..'\u0a03'
- | '\u0a05'..'\u0a0a'
- | '\u0a0f'..'\u0a10'
- | '\u0a13'..'\u0a28'
- | '\u0a2a'..'\u0a30'
- | '\u0a32'..'\u0a33'
- | '\u0a35'..'\u0a36'
- | '\u0a38'..'\u0a39'
- | '\u0a3c'
- | '\u0a3e'..'\u0a42'
- | '\u0a47'..'\u0a48'
- | '\u0a4b'..'\u0a4d'
- | '\u0a59'..'\u0a5c'
- | '\u0a5e'
- | '\u0a66'..'\u0a74'
- | '\u0a81'..'\u0a83'
- | '\u0a85'..'\u0a8d'
- | '\u0a8f'..'\u0a91'
- | '\u0a93'..'\u0aa8'
- | '\u0aaa'..'\u0ab0'
- | '\u0ab2'..'\u0ab3'
- | '\u0ab5'..'\u0ab9'
- | '\u0abc'..'\u0ac5'
- | '\u0ac7'..'\u0ac9'
- | '\u0acb'..'\u0acd'
- | '\u0ad0'
- | '\u0ae0'..'\u0ae3'
- | '\u0ae6'..'\u0aef'
- | '\u0af1'
- | '\u0b01'..'\u0b03'
- | '\u0b05'..'\u0b0c'
- | '\u0b0f'..'\u0b10'
- | '\u0b13'..'\u0b28'
- | '\u0b2a'..'\u0b30'
- | '\u0b32'..'\u0b33'
- | '\u0b35'..'\u0b39'
- | '\u0b3c'..'\u0b43'
- | '\u0b47'..'\u0b48'
- | '\u0b4b'..'\u0b4d'
- | '\u0b56'..'\u0b57'
- | '\u0b5c'..'\u0b5d'
- | '\u0b5f'..'\u0b61'
- | '\u0b66'..'\u0b6f'
- | '\u0b71'
- | '\u0b82'..'\u0b83'
- | '\u0b85'..'\u0b8a'
- | '\u0b8e'..'\u0b90'
- | '\u0b92'..'\u0b95'
- | '\u0b99'..'\u0b9a'
- | '\u0b9c'
- | '\u0b9e'..'\u0b9f'
- | '\u0ba3'..'\u0ba4'
- | '\u0ba8'..'\u0baa'
- | '\u0bae'..'\u0bb5'
- | '\u0bb7'..'\u0bb9'
- | '\u0bbe'..'\u0bc2'
- | '\u0bc6'..'\u0bc8'
- | '\u0bca'..'\u0bcd'
- | '\u0bd7'
- | '\u0be7'..'\u0bef'
- | '\u0bf9'
- | '\u0c01'..'\u0c03'
- | '\u0c05'..'\u0c0c'
- | '\u0c0e'..'\u0c10'
- | '\u0c12'..'\u0c28'
- | '\u0c2a'..'\u0c33'
- | '\u0c35'..'\u0c39'
- | '\u0c3e'..'\u0c44'
- | '\u0c46'..'\u0c48'
- | '\u0c4a'..'\u0c4d'
- | '\u0c55'..'\u0c56'
- | '\u0c60'..'\u0c61'
- | '\u0c66'..'\u0c6f'
- | '\u0c82'..'\u0c83'
- | '\u0c85'..'\u0c8c'
- | '\u0c8e'..'\u0c90'
- | '\u0c92'..'\u0ca8'
- | '\u0caa'..'\u0cb3'
- | '\u0cb5'..'\u0cb9'
- | '\u0cbc'..'\u0cc4'
- | '\u0cc6'..'\u0cc8'
- | '\u0cca'..'\u0ccd'
- | '\u0cd5'..'\u0cd6'
- | '\u0cde'
- | '\u0ce0'..'\u0ce1'
- | '\u0ce6'..'\u0cef'
- | '\u0d02'..'\u0d03'
- | '\u0d05'..'\u0d0c'
- | '\u0d0e'..'\u0d10'
- | '\u0d12'..'\u0d28'
- | '\u0d2a'..'\u0d39'
- | '\u0d3e'..'\u0d43'
- | '\u0d46'..'\u0d48'
- | '\u0d4a'..'\u0d4d'
- | '\u0d57'
- | '\u0d60'..'\u0d61'
- | '\u0d66'..'\u0d6f'
- | '\u0d82'..'\u0d83'
- | '\u0d85'..'\u0d96'
- | '\u0d9a'..'\u0db1'
- | '\u0db3'..'\u0dbb'
- | '\u0dbd'
- | '\u0dc0'..'\u0dc6'
- | '\u0dca'
- | '\u0dcf'..'\u0dd4'
- | '\u0dd6'
- | '\u0dd8'..'\u0ddf'
- | '\u0df2'..'\u0df3'
- | '\u0e01'..'\u0e3a'
- | '\u0e3f'..'\u0e4e'
- | '\u0e50'..'\u0e59'
- | '\u0e81'..'\u0e82'
- | '\u0e84'
- | '\u0e87'..'\u0e88'
- | '\u0e8a'
- | '\u0e8d'
- | '\u0e94'..'\u0e97'
- | '\u0e99'..'\u0e9f'
- | '\u0ea1'..'\u0ea3'
- | '\u0ea5'
- | '\u0ea7'
- | '\u0eaa'..'\u0eab'
- | '\u0ead'..'\u0eb9'
- | '\u0ebb'..'\u0ebd'
- | '\u0ec0'..'\u0ec4'
- | '\u0ec6'
- | '\u0ec8'..'\u0ecd'
- | '\u0ed0'..'\u0ed9'
- | '\u0edc'..'\u0edd'
- | '\u0f00'
- | '\u0f18'..'\u0f19'
- | '\u0f20'..'\u0f29'
- | '\u0f35'
- | '\u0f37'
- | '\u0f39'
- | '\u0f3e'..'\u0f47'
- | '\u0f49'..'\u0f6a'
- | '\u0f71'..'\u0f84'
- | '\u0f86'..'\u0f8b'
- | '\u0f90'..'\u0f97'
- | '\u0f99'..'\u0fbc'
- | '\u0fc6'
- | '\u1000'..'\u1021'
- | '\u1023'..'\u1027'
- | '\u1029'..'\u102a'
- | '\u102c'..'\u1032'
- | '\u1036'..'\u1039'
- | '\u1040'..'\u1049'
- | '\u1050'..'\u1059'
- | '\u10a0'..'\u10c5'
- | '\u10d0'..'\u10f8'
- | '\u1100'..'\u1159'
- | '\u115f'..'\u11a2'
- | '\u11a8'..'\u11f9'
- | '\u1200'..'\u1206'
- | '\u1208'..'\u1246'
- | '\u1248'
- | '\u124a'..'\u124d'
- | '\u1250'..'\u1256'
- | '\u1258'
- | '\u125a'..'\u125d'
- | '\u1260'..'\u1286'
- | '\u1288'
- | '\u128a'..'\u128d'
- | '\u1290'..'\u12ae'
- | '\u12b0'
- | '\u12b2'..'\u12b5'
- | '\u12b8'..'\u12be'
- | '\u12c0'
- | '\u12c2'..'\u12c5'
- | '\u12c8'..'\u12ce'
- | '\u12d0'..'\u12d6'
- | '\u12d8'..'\u12ee'
- | '\u12f0'..'\u130e'
- | '\u1310'
- | '\u1312'..'\u1315'
- | '\u1318'..'\u131e'
- | '\u1320'..'\u1346'
- | '\u1348'..'\u135a'
- | '\u1369'..'\u1371'
- | '\u13a0'..'\u13f4'
- | '\u1401'..'\u166c'
- | '\u166f'..'\u1676'
- | '\u1681'..'\u169a'
- | '\u16a0'..'\u16ea'
- | '\u16ee'..'\u16f0'
- | '\u1700'..'\u170c'
- | '\u170e'..'\u1714'
- | '\u1720'..'\u1734'
- | '\u1740'..'\u1753'
- | '\u1760'..'\u176c'
- | '\u176e'..'\u1770'
- | '\u1772'..'\u1773'
- | '\u1780'..'\u17d3'
- | '\u17d7'
- | '\u17db'..'\u17dd'
- | '\u17e0'..'\u17e9'
- | '\u180b'..'\u180d'
- | '\u1810'..'\u1819'
- | '\u1820'..'\u1877'
- | '\u1880'..'\u18a9'
- | '\u1900'..'\u191c'
- | '\u1920'..'\u192b'
- | '\u1930'..'\u193b'
- | '\u1946'..'\u196d'
- | '\u1970'..'\u1974'
- | '\u1d00'..'\u1d6b'
- | '\u1e00'..'\u1e9b'
- | '\u1ea0'..'\u1ef9'
- | '\u1f00'..'\u1f15'
- | '\u1f18'..'\u1f1d'
- | '\u1f20'..'\u1f45'
- | '\u1f48'..'\u1f4d'
- | '\u1f50'..'\u1f57'
- | '\u1f59'
- | '\u1f5b'
- | '\u1f5d'
- | '\u1f5f'..'\u1f7d'
- | '\u1f80'..'\u1fb4'
- | '\u1fb6'..'\u1fbc'
- | '\u1fbe'
- | '\u1fc2'..'\u1fc4'
- | '\u1fc6'..'\u1fcc'
- | '\u1fd0'..'\u1fd3'
- | '\u1fd6'..'\u1fdb'
- | '\u1fe0'..'\u1fec'
- | '\u1ff2'..'\u1ff4'
- | '\u1ff6'..'\u1ffc'
- | '\u200c'..'\u200f'
- | '\u202a'..'\u202e'
- | '\u203f'..'\u2040'
- | '\u2054'
- | '\u2060'..'\u2063'
- | '\u206a'..'\u206f'
- | '\u2071'
- | '\u207f'
- | '\u20a0'..'\u20b1'
- | '\u20d0'..'\u20dc'
- | '\u20e1'
- | '\u20e5'..'\u20ea'
- | '\u2102'
- | '\u2107'
- | '\u210a'..'\u2113'
- | '\u2115'
- | '\u2119'..'\u211d'
- | '\u2124'
- | '\u2126'
- | '\u2128'
- | '\u212a'..'\u212d'
- | '\u212f'..'\u2131'
- | '\u2133'..'\u2139'
- | '\u213d'..'\u213f'
- | '\u2145'..'\u2149'
- | '\u2160'..'\u2183'
- | '\u3005'..'\u3007'
- | '\u3021'..'\u302f'
- | '\u3031'..'\u3035'
- | '\u3038'..'\u303c'
- | '\u3041'..'\u3096'
- | '\u3099'..'\u309a'
- | '\u309d'..'\u309f'
- | '\u30a1'..'\u30ff'
- | '\u3105'..'\u312c'
- | '\u3131'..'\u318e'
- | '\u31a0'..'\u31b7'
- | '\u31f0'..'\u31ff'
- | '\u3400'..'\u4db5'
- | '\u4e00'..'\u9fa5'
- | '\ua000'..'\ua48c'
- | '\uac00'..'\ud7a3'
- | '\uf900'..'\ufa2d'
- | '\ufa30'..'\ufa6a'
- | '\ufb00'..'\ufb06'
- | '\ufb13'..'\ufb17'
- | '\ufb1d'..'\ufb28'
- | '\ufb2a'..'\ufb36'
- | '\ufb38'..'\ufb3c'
- | '\ufb3e'
- | '\ufb40'..'\ufb41'
- | '\ufb43'..'\ufb44'
- | '\ufb46'..'\ufbb1'
- | '\ufbd3'..'\ufd3d'
- | '\ufd50'..'\ufd8f'
- | '\ufd92'..'\ufdc7'
- | '\ufdf0'..'\ufdfc'
- | '\ufe00'..'\ufe0f'
- | '\ufe20'..'\ufe23'
- | '\ufe33'..'\ufe34'
- | '\ufe4d'..'\ufe4f'
- | '\ufe69'
- | '\ufe70'..'\ufe74'
- | '\ufe76'..'\ufefc'
- | '\ufeff'
- | '\uff04'
- | '\uff10'..'\uff19'
- | '\uff21'..'\uff3a'
- | '\uff3f'
- | '\uff41'..'\uff5a'
- | '\uff65'..'\uffbe'
- | '\uffc2'..'\uffc7'
- | '\uffca'..'\uffcf'
- | '\uffd2'..'\uffd7'
- | '\uffda'..'\uffdc'
- | '\uffe0'..'\uffe1'
- | '\uffe5'..'\uffe6'
- | '\ufff9'..'\ufffb'
- | ('\ud800'..'\udbff') ('\udc00'..'\udfff')
- ;
-
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
new file mode 100644
index 0000000..dbe5450
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
@@ -0,0 +1,20 @@
+package org.apache.tiles.autotag.core;
+
+public class AutotagRuntimeException extends RuntimeException {
+
+ public AutotagRuntimeException() {
+ }
+
+ public AutotagRuntimeException(String message) {
+ super(message);
+ }
+
+ public AutotagRuntimeException(Throwable cause) {
+ super(cause);
+ }
+
+ public AutotagRuntimeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
new file mode 100644
index 0000000..10a940b
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
@@ -0,0 +1,20 @@
+package org.apache.tiles.autotag.core;
+
+public class ClassParseException extends AutotagRuntimeException {
+
+ public ClassParseException() {
+ }
+
+ public ClassParseException(String message) {
+ super(message);
+ }
+
+ public ClassParseException(Throwable cause) {
+ super(cause);
+ }
+
+ public ClassParseException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java
new file mode 100644
index 0000000..184ddd4
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java
@@ -0,0 +1,135 @@
+package org.apache.tiles.autotag.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tiles.autotag.model.TemplateClass;
+import org.apache.tiles.autotag.model.TemplateMethod;
+import org.apache.tiles.autotag.model.TemplateParameter;
+import org.apache.tiles.autotag.model.TemplateSuite;
+import org.apache.tiles.autotag.model.TemplateSuiteFactory;
+import org.apache.tiles.request.Request;
+
+import com.thoughtworks.qdox.JavaDocBuilder;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaParameter;
+import com.thoughtworks.qdox.model.Type;
+
+public class QDoxTemplateSuiteFactory implements TemplateSuiteFactory {
+
+ private JavaDocBuilder builder;
+
+ private String suiteName;
+
+ private String suiteDocumentation;
+
+ public QDoxTemplateSuiteFactory(File...sourceFiles) {
+ builder = new JavaDocBuilder();
+ try {
+ for (File file : sourceFiles) {
+ builder.addSource(file);
+ }
+ } catch (IOException e) {
+ throw new ClassParseException("I/O Exception when adding source files", e);
+ }
+ }
+
+ public QDoxTemplateSuiteFactory(URL... urls) {
+ builder = new JavaDocBuilder();
+ try {
+ for (URL url: urls) {
+ builder.addSource(url);
+ }
+ } catch (IOException e) {
+ throw new ClassParseException("I/O Exception when adding source files", e);
+ }
+ }
+
+ public void setSuiteName(String suiteName) {
+ this.suiteName = suiteName;
+ }
+
+ public void setSuiteDocumentation(String suiteDocumentation) {
+ this.suiteDocumentation = suiteDocumentation;
+ }
+
+ @Override
+ public TemplateSuite createTemplateSuite() {
+ List<TemplateClass> classes = new ArrayList<TemplateClass>();
+ for (JavaClass clazz : builder.getClasses()) {
+ TemplateMethod startMethod = null;
+ TemplateMethod endMethod = null;
+ TemplateMethod executeMethod = null;
+ for (JavaMethod method : clazz.getMethods()) {
+ if (isFeasible(method)) {
+ if ("start".equals(method.getName())) {
+ TemplateMethod templateMethod = createMethod(method);
+ startMethod = templateMethod;
+ } else if ("end".equals(method.getName())) {
+ endMethod = createMethod(method);
+ } else if ("execute".equals(method.getName())) {
+ executeMethod = createMethod(method);
+ }
+ }
+ }
+ if ((startMethod != null && endMethod != null)
+ || executeMethod != null) {
+ TemplateClass templateClass = new TemplateClass(
+ clazz.getFullyQualifiedName(), startMethod, endMethod, executeMethod);
+ templateClass.setDocumentation(clazz.getComment());
+ classes.add(templateClass);
+ }
+ }
+ return new TemplateSuite(suiteName, suiteDocumentation, classes);
+ }
+
+ private TemplateMethod createMethod(JavaMethod method) {
+ List<TemplateParameter> params = new ArrayList<TemplateParameter>();
+ for (JavaParameter parameter : method.getParameters()) {
+ TemplateParameter templateParameter = new TemplateParameter(
+ parameter.getName(), parameter.getType()
+ .getFullyQualifiedName(), false, false);
+ params.add(templateParameter);
+ }
+ TemplateMethod templateMethod = new TemplateMethod(method.getName(),
+ params);
+ templateMethod.setDocumentation(method.getComment());
+ DocletTag[] tags = method.getTagsByName("param");
+ for (DocletTag tag : tags) {
+ String[] tagParams = tag.getParameters();
+ if (tagParams.length > 0) {
+ TemplateParameter templateParameter = templateMethod
+ .getParameterByName(tagParams[0]);
+ if (templateParameter != null) {
+ String tagValue = tag.getValue();
+ int pos = tagValue.indexOf(" ");
+ templateParameter.setDocumentation(tagValue.substring(pos)
+ .trim());
+ }
+ }
+ }
+ return templateMethod;
+ }
+
+ private boolean isFeasible(JavaMethod method) {
+ Type returns = method.getReturns();
+ if (returns != null && "void".equals(returns.getFullyQualifiedName())
+ && method.isPublic() && !method.isStatic()
+ && !method.isAbstract() && !method.isConstructor()) {
+ JavaParameter[] params = method.getParameters();
+ if (params.length > 0) {
+ JavaParameter param = params[params.length - 1];
+ if (Request.class.getName().equals(
+ param.getType().getFullyQualifiedName())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java
new file mode 100644
index 0000000..7c43cbf
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java
@@ -0,0 +1,59 @@
+package org.apache.tiles.autotag.model;
+
+public class TemplateClass {
+
+ private String name;
+
+ private String documentation;
+
+ private TemplateMethod startMethod;
+
+ private TemplateMethod endMethod;
+
+ private TemplateMethod executeMethod;
+
+ public TemplateClass(String name) {
+ this(name, null, null, null);
+ }
+
+ public TemplateClass(String name,
+ TemplateMethod startMethod, TemplateMethod endMethod,
+ TemplateMethod executeMethod) {
+ this.name = name;
+ this.startMethod = startMethod;
+ this.endMethod = endMethod;
+ this.executeMethod = executeMethod;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDocumentation() {
+ return documentation;
+ }
+
+ public void setDocumentation(String documentation) {
+ this.documentation = documentation;
+ }
+
+ public TemplateMethod getStartMethod() {
+ return startMethod;
+ }
+
+ public TemplateMethod getEndMethod() {
+ return endMethod;
+ }
+
+ public TemplateMethod getExecuteMethod() {
+ return executeMethod;
+ }
+
+ @Override
+ public String toString() {
+ return "TemplateClass\n[documentation=" + documentation + ",\nendMethod="
+ + endMethod + ",\nexecuteMethod=" + executeMethod + ",\nname="
+ + name + ",\nstartMethod=" + startMethod + "]";
+ }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java
new file mode 100644
index 0000000..aca9e80
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java
@@ -0,0 +1,50 @@
+package org.apache.tiles.autotag.model;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class TemplateMethod {
+
+ private String name;
+
+ private String documentation;
+
+ private Map<String, TemplateParameter> parameters;
+
+ public TemplateMethod(String name,
+ Iterable<? extends TemplateParameter> parameters) {
+ this.name = name;
+ this.parameters = new LinkedHashMap<String, TemplateParameter>();
+ for (TemplateParameter parameter : parameters) {
+ this.parameters.put(parameter.getName(), parameter);
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDocumentation() {
+ return documentation;
+ }
+
+ public void setDocumentation(String documentation) {
+ this.documentation = documentation;
+ }
+
+ public Collection<TemplateParameter> getParameters() {
+ return parameters.values();
+ }
+
+ public TemplateParameter getParameterByName(String name) {
+ return parameters.get(name);
+ }
+
+ @Override
+ public String toString() {
+ return "TemplateMethod\n[documentation=" + documentation + ", name="
+ + name + ", parameters=\n" + parameters + "]";
+ }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java
new file mode 100644
index 0000000..a7dbfd6
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java
@@ -0,0 +1,54 @@
+package org.apache.tiles.autotag.model;
+
+public class TemplateParameter {
+
+ private String name;
+
+ private String documentation;
+
+ private String type;
+
+ private boolean required;
+
+ private boolean body;
+
+ public TemplateParameter(String name, String type, boolean required,
+ boolean body) {
+ this.name = name;
+ this.type = type;
+ this.required = required;
+ this.body = body;
+ }
+
+ public String getDocumentation() {
+ return documentation;
+ }
+
+ public void setDocumentation(String documentation) {
+ this.documentation = documentation;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public boolean isRequired() {
+ return required;
+ }
+
+ public boolean isBody() {
+ return body;
+ }
+
+ @Override
+ public String toString() {
+ return "TemplateParameter\n[body=" + body + ",\ndocumentation="
+ + documentation + ",\nname=" + name + ", required=" + required
+ + ", type=" + type + "]";
+ }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java
new file mode 100644
index 0000000..3753e87
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java
@@ -0,0 +1,57 @@
+package org.apache.tiles.autotag.model;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class TemplateSuite {
+
+ private String name;
+
+ private String documentation;
+
+ Map<String, TemplateClass> templateClasses;
+
+ public TemplateSuite(String name, String documentation) {
+ this(name, documentation, null);
+ }
+
+ public TemplateSuite(String name, String documentation,
+ Iterable<? extends TemplateClass> classes) {
+ this.name = name;
+ this.documentation = documentation;
+ templateClasses = new LinkedHashMap<String, TemplateClass>();
+ if (classes != null) {
+ for (TemplateClass templateClass : classes) {
+ templateClasses.put(templateClass.getName(), templateClass);
+ }
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDocumentation() {
+ return documentation;
+ }
+
+ public void addTemplateClass(TemplateClass clazz) {
+ templateClasses.put(clazz.getName(), clazz);
+ }
+
+ public Collection<TemplateClass> getTemplateClasses() {
+ return templateClasses.values();
+ }
+
+ public TemplateClass getTemplateClassByName(String name) {
+ return templateClasses.get(name);
+ }
+
+ @Override
+ public String toString() {
+ return "TemplateSuite\n[documentation=" + documentation + ", name="
+ + name + ", templateClasses=\n" + templateClasses + "]";
+ }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java
new file mode 100644
index 0000000..690c735
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java
@@ -0,0 +1,7 @@
+package org.apache.tiles.autotag.model;
+
+
+public interface TemplateSuiteFactory {
+
+ TemplateSuite createTemplateSuite();
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactoryTest.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactoryTest.java
new file mode 100644
index 0000000..bfced11
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactoryTest.java
@@ -0,0 +1,124 @@
+/**
+ *
+ */
+package org.apache.tiles.autotag.core;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tiles.autotag.core.internal.ExampleExecutableTemplate;
+import org.apache.tiles.autotag.core.internal.ExampleTemplate;
+import org.apache.tiles.autotag.core.internal.NotFeasibleExampleTemplate;
+import org.apache.tiles.autotag.model.TemplateClass;
+import org.apache.tiles.autotag.model.TemplateMethod;
+import org.apache.tiles.autotag.model.TemplateParameter;
+import org.apache.tiles.autotag.model.TemplateSuite;
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests {@link QDoxTemplateSuiteFactory}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class QDoxTemplateSuiteFactoryTest {
+
+ private QDoxTemplateSuiteFactory factory;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() {
+ factory = new QDoxTemplateSuiteFactory(getClass().getResource("/org/apache/tiles/autotag/core/internal/ExampleTemplate.java"),
+ getClass().getResource("/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java"),
+ getClass().getResource("/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java"));
+ factory.setSuiteName("The suite name");
+ factory.setSuiteDocumentation("This are the docs");
+ }
+
+ /**
+ * Test method for {@link org.apache.tiles.autotag.core.DefaultTemplateSuiteFactory#createTemplateSuite()}.
+ */
+ @Test
+ public void testCreateTemplateSuite() {
+ TemplateSuite suite = factory.createTemplateSuite();
+ assertEquals("The suite name", suite.getName());
+ assertEquals("This are the docs", suite.getDocumentation());
+ assertEquals(2, suite.getTemplateClasses().size());
+
+ TemplateClass templateClass = suite.getTemplateClassByName(ExampleTemplate.class.getName());
+ assertNotNull(templateClass);
+ assertEquals(ExampleTemplate.class.getName(), templateClass.getName());
+ assertEquals("Example start/stop template.", templateClass.getDocumentation());
+ assertNull(templateClass.getExecuteMethod());
+ TemplateMethod templateMethod = templateClass.getStartMethod();
+ assertNotNull(templateMethod);
+ assertEquals("start", templateMethod.getName());
+ assertEquals("It starts.", templateMethod.getDocumentation());
+ List<TemplateParameter> parameters = new ArrayList<TemplateParameter>(templateMethod.getParameters());
+ assertEquals(3, parameters.size());
+ TemplateParameter parameter = parameters.get(0);
+ assertEquals("one", parameter.getName());
+ assertEquals("java.lang.String", parameter.getType());
+ assertEquals("Parameter one.", parameter.getDocumentation());
+ parameter = parameters.get(1);
+ assertEquals("two", parameter.getName());
+ assertEquals("int", parameter.getType());
+ assertEquals("Parameter two.", parameter.getDocumentation());
+ parameter = parameters.get(2);
+ assertEquals("request", parameter.getName());
+ assertEquals(Request.class.getName(), parameter.getType());
+ assertEquals("The request.", parameter.getDocumentation());
+
+ templateMethod = templateClass.getEndMethod();
+ assertNotNull(templateMethod);
+ assertEquals("end", templateMethod.getName());
+ assertEquals("It ends.", templateMethod.getDocumentation());
+ parameters = new ArrayList<TemplateParameter>(templateMethod.getParameters());
+ assertEquals(3, parameters.size());
+ parameter = parameters.get(0);
+ assertEquals("three", parameter.getName());
+ assertEquals("java.lang.Double", parameter.getType());
+ assertEquals("Parameter three.", parameter.getDocumentation());
+ parameter = parameters.get(1);
+ assertEquals("four", parameter.getName());
+ assertEquals("long", parameter.getType());
+ assertEquals("Parameter four.", parameter.getDocumentation());
+ parameter = parameters.get(2);
+ assertEquals("request", parameter.getName());
+ assertEquals(Request.class.getName(), parameter.getType());
+ assertEquals("The request.", parameter.getDocumentation());
+
+ templateClass = suite.getTemplateClassByName(ExampleExecutableTemplate.class.getName());
+ assertNotNull(templateClass);
+ assertEquals(ExampleExecutableTemplate.class.getName(), templateClass.getName());
+ assertEquals("Example executable template.", templateClass.getDocumentation());
+ assertNull(templateClass.getStartMethod());
+ assertNull(templateClass.getEndMethod());
+ templateMethod = templateClass.getExecuteMethod();
+ assertNotNull(templateMethod);
+ assertEquals("execute", templateMethod.getName());
+ assertEquals("It executes.", templateMethod.getDocumentation());
+ parameters = new ArrayList<TemplateParameter>(templateMethod.getParameters());
+ assertEquals(3, parameters.size());
+ parameter = parameters.get(0);
+ assertEquals("one", parameter.getName());
+ assertEquals("java.lang.String", parameter.getType());
+ assertEquals("Parameter one.", parameter.getDocumentation());
+ parameter = parameters.get(1);
+ assertEquals("two", parameter.getName());
+ assertEquals("int", parameter.getType());
+ assertEquals("Parameter two.", parameter.getDocumentation());
+ parameter = parameters.get(2);
+ assertEquals("request", parameter.getName());
+ assertEquals(Request.class.getName(), parameter.getType());
+ assertEquals("The request.", parameter.getDocumentation());
+
+ assertNull(suite.getTemplateClassByName(NotFeasibleExampleTemplate.class.getName()));
+ }
+
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java
new file mode 100644
index 0000000..45ac04d
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java
@@ -0,0 +1,22 @@
+package org.apache.tiles.autotag.core.internal;
+
+import org.apache.tiles.request.Request;
+
+/**
+ * Example executable template.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ExampleExecutableTemplate {
+
+ /**
+ * It executes.
+ *
+ * @param one Parameter one.
+ * @param two Parameter two.
+ * @param request The request.
+ */
+ public void execute(String one, int two, Request request) {
+ // Does nothing.
+ }
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleTemplate.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleTemplate.java
new file mode 100644
index 0000000..66d9895
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleTemplate.java
@@ -0,0 +1,33 @@
+package org.apache.tiles.autotag.core.internal;
+
+import org.apache.tiles.request.Request;
+
+/**
+ * Example start/stop template.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ExampleTemplate {
+
+ /**
+ * It starts.
+ *
+ * @param one Parameter one.
+ * @param two Parameter two.
+ * @param request The request.
+ */
+ public void start(String one, int two, Request request) {
+ // Does nothing.
+ }
+
+ /**
+ * It ends.
+ *
+ * @param three Parameter three.
+ * @param four Parameter four.
+ * @param request The request.
+ */
+ public void end(Double three, long four, Request request) {
+ // Does nothing.
+ }
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java
new file mode 100644
index 0000000..cfb12a9
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java
@@ -0,0 +1,18 @@
+package org.apache.tiles.autotag.core.internal;
+
+/**
+ * This won't be registered.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NotFeasibleExampleTemplate {
+
+ /**
+ * It starts.
+ *
+ * @param whatever Doesn't matter.
+ */
+ public void start(String whatever) {
+ // Does nothing.
+ }
+}