From 4511b0f08bc8dc4a3a9b2f658ded05385577c351 Mon Sep 17 00:00:00 2001 From: Gilles QUERRET Date: Fri, 4 Oct 2019 15:13:30 +0200 Subject: [PATCH 01/47] Next dev cycle --- database-parser/pom.xml | 2 +- listing-parser/pom.xml | 2 +- openedge-checks/pom.xml | 6 +++--- openedge-plugin/pom.xml | 8 ++++---- pom.xml | 2 +- profiler-parser/pom.xml | 2 +- proparse/pom.xml | 4 ++-- rcode-reader/pom.xml | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/database-parser/pom.xml b/database-parser/pom.xml index b7bc70e33..dee0e9580 100644 --- a/database-parser/pom.xml +++ b/database-parser/pom.xml @@ -4,7 +4,7 @@ eu.rssw.openedge.parsers database-parser - 2.6.0 + 2.6.1-SNAPSHOT OpenEdge database definition lexer and parser OpenEdge dump files parser diff --git a/listing-parser/pom.xml b/listing-parser/pom.xml index ce971a92f..e0d9a22d6 100644 --- a/listing-parser/pom.xml +++ b/listing-parser/pom.xml @@ -4,7 +4,7 @@ eu.rssw.openedge.parsers listing-parser - 2.6.0 + 2.6.1-SNAPSHOT OpenEdge listing so-called parser OpenEdge listing files parser diff --git a/openedge-checks/pom.xml b/openedge-checks/pom.xml index da8522b40..39b2c7b10 100644 --- a/openedge-checks/pom.xml +++ b/openedge-checks/pom.xml @@ -4,7 +4,7 @@ eu.rssw.openedge.checks openedge-checks - 2.6.0 + 2.6.1-SNAPSHOT OpenEdge checks OpenEdge checks @@ -54,12 +54,12 @@ eu.rssw.openedge.parsers database-parser - 2.6.0 + 2.6.1-SNAPSHOT eu.rssw.openedge.parsers proparse - 2.6.0 + 2.6.1-SNAPSHOT org.testng diff --git a/openedge-plugin/pom.xml b/openedge-plugin/pom.xml index b01e45842..121ccef30 100644 --- a/openedge-plugin/pom.xml +++ b/openedge-plugin/pom.xml @@ -4,7 +4,7 @@ eu.rssw.sonar.openedge sonar-openedge-plugin - 2.6.0 + 2.6.1-SNAPSHOT sonar-plugin OpenEdge plugin for SonarQube @@ -62,17 +62,17 @@ eu.rssw.openedge.checks openedge-checks - 2.6.0 + 2.6.1-SNAPSHOT eu.rssw.openedge.parsers listing-parser - 2.6.0 + 2.6.1-SNAPSHOT eu.rssw.openedge.parsers profiler-parser - 2.6.0 + 2.6.1-SNAPSHOT commons-lang diff --git a/pom.xml b/pom.xml index f2f2bb641..93082017a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ eu.rssw sonar-openedge pom - 2.6.0 + 2.6.1-SNAPSHOT OpenEdge plugin for SonarQube http://www.riverside-software.fr/ Open source code analysis for OpenEdge diff --git a/profiler-parser/pom.xml b/profiler-parser/pom.xml index 21b9dd3ec..78c37f36c 100644 --- a/profiler-parser/pom.xml +++ b/profiler-parser/pom.xml @@ -4,7 +4,7 @@ eu.rssw.openedge.parsers profiler-parser - 2.6.0 + 2.6.1-SNAPSHOT OpenEdge profiler output lexer and parser OpenEdge profiler files parser diff --git a/proparse/pom.xml b/proparse/pom.xml index 3375f2c7a..f818224ea 100644 --- a/proparse/pom.xml +++ b/proparse/pom.xml @@ -4,7 +4,7 @@ eu.rssw.openedge.parsers proparse - 2.6.0 + 2.6.1-SNAPSHOT Proparse ABL code parser @@ -54,7 +54,7 @@ eu.rssw.openedge.rcode rcode-reader - 2.6.0 + 2.6.1-SNAPSHOT org.antlr diff --git a/rcode-reader/pom.xml b/rcode-reader/pom.xml index 5ee92fee8..88a3f49ed 100644 --- a/rcode-reader/pom.xml +++ b/rcode-reader/pom.xml @@ -4,7 +4,7 @@ eu.rssw.openedge.rcode rcode-reader - 2.6.0 + 2.6.1-SNAPSHOT rcode-reader rcode reader From 6f2fa95833bd81197b23f7bedb6453f314e02bde Mon Sep 17 00:00:00 2001 From: Gilles QUERRET Date: Sun, 13 Oct 2019 21:06:56 +0200 Subject: [PATCH 02/47] Javadoc target on main branches --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index d5fbf93de..758831478 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,7 +16,7 @@ pipeline { // Maven Central deployment: 'mvn -P release clean package verify deploy' sh "git rev-parse HEAD > current-commit" def currCommit = readFile('current-commit').replace("\n", "").replace("\r", "") - sh "mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true -Dgit.commit=${currCommit}" + sh "mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent javadoc:javadoc install -Dmaven.test.failure.ignore=true -Dgit.commit=${currCommit}" } else { sh "mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package -Dmaven.test.failure.ignore=true" } From 9de9e7bf9b922d5dcb424fc57e783ea38a390d1b Mon Sep 17 00:00:00 2001 From: Gilles QUERRET Date: Sun, 13 Oct 2019 21:09:43 +0200 Subject: [PATCH 03/47] Fix Javadoc on JAXB objects --- .../com/progress/xref/CrossReference.java | 990 +++++++++--------- 1 file changed, 495 insertions(+), 495 deletions(-) diff --git a/proparse/src/main/java/com/progress/xref/CrossReference.java b/proparse/src/main/java/com/progress/xref/CrossReference.java index 9fd94f408..32b147bb8 100644 --- a/proparse/src/main/java/com/progress/xref/CrossReference.java +++ b/proparse/src/main/java/com/progress/xref/CrossReference.java @@ -38,148 +38,148 @@ *

The following schema fragment specifies the expected content contained within this class. * *

- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="Source" maxOccurs="unbounded" minOccurs="0">
- *           <complexType>
- *             <complexContent>
- *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                 <sequence>
- *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                   <element name="Reference" maxOccurs="unbounded" minOccurs="0">
- *                     <complexType>
- *                       <complexContent>
- *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                           <sequence>
- *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                             <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                             <element name="Line-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                             <element name="Object-context" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                             <element name="Access-mode" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                             <element name="Data-member-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                             <element name="Temp-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                             <element name="Detail" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                             <element name="Is-static" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                             <element name="Is-abstract" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                             <element name="Class-ref" maxOccurs="unbounded" minOccurs="0">
- *                               <complexType>
- *                                 <complexContent>
- *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                                     <sequence>
- *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                                       <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                                       <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                                     </sequence>
- *                                   </restriction>
- *                                 </complexContent>
- *                               </complexType>
- *                             </element>
- *                             <element name="String-ref" maxOccurs="unbounded" minOccurs="0">
- *                               <complexType>
- *                                 <complexContent>
- *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                                     <sequence>
- *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                                     </sequence>
- *                                   </restriction>
- *                                 </complexContent>
- *                               </complexType>
- *                             </element>
- *                             <element name="Parameter-ref" maxOccurs="unbounded" minOccurs="0">
- *                               <complexType>
- *                                 <complexContent>
- *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                                     <sequence>
- *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                                       <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                     </sequence>
- *                                     <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                                     <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                     <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                     <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                   </restriction>
- *                                 </complexContent>
- *                               </complexType>
- *                             </element>
- *                             <element name="Dataset-ref" maxOccurs="unbounded" minOccurs="0">
- *                               <complexType>
- *                                 <complexContent>
- *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                                     <sequence>
- *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
- *                                       <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="Relation" maxOccurs="unbounded" minOccurs="0">
- *                                         <complexType>
- *                                           <complexContent>
- *                                             <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                                               <sequence>
- *                                                 <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                                 <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                                 <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                                 <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                                 <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                               </sequence>
- *                                               <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                             </restriction>
- *                                           </complexContent>
- *                                         </complexType>
- *                                       </element>
- *                                     </sequence>
- *                                   </restriction>
- *                                 </complexContent>
- *                               </complexType>
- *                             </element>
- *                             <element name="Interface-ref" maxOccurs="unbounded" minOccurs="0">
- *                               <complexType>
- *                                 <complexContent>
- *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                                     <sequence>
- *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *                                       <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                                     </sequence>
- *                                   </restriction>
- *                                 </complexContent>
- *                               </complexType>
- *                             </element>
- *                           </sequence>
- *                           <attribute name="Reference-type" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                           <attribute name="Object-identifier" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                         </restriction>
- *                       </complexContent>
- *                     </complexType>
- *                   </element>
- *                 </sequence>
- *                 <attribute name="File-name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *               </restriction>
- *             </complexContent>
- *           </complexType>
- *         </element>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="Source" maxOccurs="unbounded" minOccurs="0">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                   <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                   <element name="Reference" maxOccurs="unbounded" minOccurs="0">
+ *                     <complexType>
+ *                       <complexContent>
+ *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                           <sequence>
+ *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                             <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                             <element name="Line-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                             <element name="Object-context" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                             <element name="Access-mode" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                             <element name="Data-member-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                             <element name="Temp-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                             <element name="Detail" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                             <element name="Is-static" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                             <element name="Is-abstract" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                             <element name="Class-ref" maxOccurs="unbounded" minOccurs="0">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <sequence>
+ *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                                       <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                                       <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                                     </sequence>
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                             <element name="String-ref" maxOccurs="unbounded" minOccurs="0">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <sequence>
+ *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                                     </sequence>
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                             <element name="Parameter-ref" maxOccurs="unbounded" minOccurs="0">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <sequence>
+ *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                                       <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                     </sequence>
+ *                                     <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
+ *                                     <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                                     <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                                     <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                             <element name="Dataset-ref" maxOccurs="unbounded" minOccurs="0">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <sequence>
+ *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ *                                       <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="Relation" maxOccurs="unbounded" minOccurs="0">
+ *                                         <complexType>
+ *                                           <complexContent>
+ *                                             <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                               <sequence>
+ *                                                 <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                                 <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                                 <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                                 <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                                 <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                               </sequence>
+ *                                               <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                                             </restriction>
+ *                                           </complexContent>
+ *                                         </complexType>
+ *                                       </element>
+ *                                     </sequence>
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                             <element name="Interface-ref" maxOccurs="unbounded" minOccurs="0">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <sequence>
+ *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                       <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *                                       <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *                                     </sequence>
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                           </sequence>
+ *                           <attribute name="Reference-type" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                           <attribute name="Object-identifier" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                         </restriction>
+ *                       </complexContent>
+ *                     </complexType>
+ *                   </element>
+ *                 </sequence>
+ *                 <attribute name="File-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
  * 
* * @@ -230,138 +230,138 @@ public List getSource() { *

The following schema fragment specifies the expected content contained within this class. * *

-     * <complexType>
-     *   <complexContent>
-     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       <sequence>
-     *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *         <element name="Reference" maxOccurs="unbounded" minOccurs="0">
-     *           <complexType>
-     *             <complexContent>
-     *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                 <sequence>
-     *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                   <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                   <element name="Line-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                   <element name="Object-context" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                   <element name="Access-mode" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                   <element name="Data-member-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                   <element name="Temp-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                   <element name="Detail" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                   <element name="Is-static" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                   <element name="Is-abstract" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                   <element name="Class-ref" maxOccurs="unbounded" minOccurs="0">
-     *                     <complexType>
-     *                       <complexContent>
-     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                           <sequence>
-     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                             <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                             <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                           </sequence>
-     *                         </restriction>
-     *                       </complexContent>
-     *                     </complexType>
-     *                   </element>
-     *                   <element name="String-ref" maxOccurs="unbounded" minOccurs="0">
-     *                     <complexType>
-     *                       <complexContent>
-     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                           <sequence>
-     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                           </sequence>
-     *                         </restriction>
-     *                       </complexContent>
-     *                     </complexType>
-     *                   </element>
-     *                   <element name="Parameter-ref" maxOccurs="unbounded" minOccurs="0">
-     *                     <complexType>
-     *                       <complexContent>
-     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                           <sequence>
-     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                             <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                           </sequence>
-     *                           <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *                           <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                           <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                           <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                         </restriction>
-     *                       </complexContent>
-     *                     </complexType>
-     *                   </element>
-     *                   <element name="Dataset-ref" maxOccurs="unbounded" minOccurs="0">
-     *                     <complexType>
-     *                       <complexContent>
-     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                           <sequence>
-     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-     *                             <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="Relation" maxOccurs="unbounded" minOccurs="0">
-     *                               <complexType>
-     *                                 <complexContent>
-     *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                                     <sequence>
-     *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                                       <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                                       <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                                       <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                                       <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                                     </sequence>
-     *                                     <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                                   </restriction>
-     *                                 </complexContent>
-     *                               </complexType>
-     *                             </element>
-     *                           </sequence>
-     *                         </restriction>
-     *                       </complexContent>
-     *                     </complexType>
-     *                   </element>
-     *                   <element name="Interface-ref" maxOccurs="unbounded" minOccurs="0">
-     *                     <complexType>
-     *                       <complexContent>
-     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                           <sequence>
-     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-     *                             <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *                           </sequence>
-     *                         </restriction>
-     *                       </complexContent>
-     *                     </complexType>
-     *                   </element>
-     *                 </sequence>
-     *                 <attribute name="Reference-type" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                 <attribute name="Object-identifier" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *               </restriction>
-     *             </complexContent>
-     *           </complexType>
-     *         </element>
-     *       </sequence>
-     *       <attribute name="File-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *     </restriction>
-     *   </complexContent>
-     * </complexType>
+     * <complexType>
+     *   <complexContent>
+     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *       <sequence>
+     *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *         <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *         <element name="Reference" maxOccurs="unbounded" minOccurs="0">
+     *           <complexType>
+     *             <complexContent>
+     *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                 <sequence>
+     *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                   <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                   <element name="Line-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                   <element name="Object-context" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                   <element name="Access-mode" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                   <element name="Data-member-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                   <element name="Temp-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                   <element name="Detail" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                   <element name="Is-static" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                   <element name="Is-abstract" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                   <element name="Class-ref" maxOccurs="unbounded" minOccurs="0">
+     *                     <complexType>
+     *                       <complexContent>
+     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                           <sequence>
+     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                             <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                             <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                           </sequence>
+     *                         </restriction>
+     *                       </complexContent>
+     *                     </complexType>
+     *                   </element>
+     *                   <element name="String-ref" maxOccurs="unbounded" minOccurs="0">
+     *                     <complexType>
+     *                       <complexContent>
+     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                           <sequence>
+     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                           </sequence>
+     *                         </restriction>
+     *                       </complexContent>
+     *                     </complexType>
+     *                   </element>
+     *                   <element name="Parameter-ref" maxOccurs="unbounded" minOccurs="0">
+     *                     <complexType>
+     *                       <complexContent>
+     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                           <sequence>
+     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                             <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                           </sequence>
+     *                           <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
+     *                           <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                           <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                           <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                         </restriction>
+     *                       </complexContent>
+     *                     </complexType>
+     *                   </element>
+     *                   <element name="Dataset-ref" maxOccurs="unbounded" minOccurs="0">
+     *                     <complexType>
+     *                       <complexContent>
+     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                           <sequence>
+     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+     *                             <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="Relation" maxOccurs="unbounded" minOccurs="0">
+     *                               <complexType>
+     *                                 <complexContent>
+     *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                                     <sequence>
+     *                                       <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                                       <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                                       <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                                       <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                                       <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                                     </sequence>
+     *                                     <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                                   </restriction>
+     *                                 </complexContent>
+     *                               </complexType>
+     *                             </element>
+     *                           </sequence>
+     *                         </restriction>
+     *                       </complexContent>
+     *                     </complexType>
+     *                   </element>
+     *                   <element name="Interface-ref" maxOccurs="unbounded" minOccurs="0">
+     *                     <complexType>
+     *                       <complexContent>
+     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                           <sequence>
+     *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                             <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+     *                             <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+     *                           </sequence>
+     *                         </restriction>
+     *                       </complexContent>
+     *                     </complexType>
+     *                   </element>
+     *                 </sequence>
+     *                 <attribute name="Reference-type" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                 <attribute name="Object-identifier" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *               </restriction>
+     *             </complexContent>
+     *           </complexType>
+     *         </element>
+     *       </sequence>
+     *       <attribute name="File-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *     </restriction>
+     *   </complexContent>
+     * </complexType>
      * 
* * @@ -491,125 +491,125 @@ public void setFileName(String value) { *

The following schema fragment specifies the expected content contained within this class. * *

-         * <complexType>
-         *   <complexContent>
-         *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *       <sequence>
-         *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *         <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *         <element name="Line-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *         <element name="Object-context" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *         <element name="Access-mode" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *         <element name="Data-member-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *         <element name="Temp-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *         <element name="Detail" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *         <element name="Is-static" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *         <element name="Is-abstract" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *         <element name="Class-ref" maxOccurs="unbounded" minOccurs="0">
-         *           <complexType>
-         *             <complexContent>
-         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *                 <sequence>
-         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *                   <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *                   <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *                 </sequence>
-         *               </restriction>
-         *             </complexContent>
-         *           </complexType>
-         *         </element>
-         *         <element name="String-ref" maxOccurs="unbounded" minOccurs="0">
-         *           <complexType>
-         *             <complexContent>
-         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *                 <sequence>
-         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *                 </sequence>
-         *               </restriction>
-         *             </complexContent>
-         *           </complexType>
-         *         </element>
-         *         <element name="Parameter-ref" maxOccurs="unbounded" minOccurs="0">
-         *           <complexType>
-         *             <complexContent>
-         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *                 <sequence>
-         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *                   <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                 </sequence>
-         *                 <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *                 <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *                 <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *                 <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *               </restriction>
-         *             </complexContent>
-         *           </complexType>
-         *         </element>
-         *         <element name="Dataset-ref" maxOccurs="unbounded" minOccurs="0">
-         *           <complexType>
-         *             <complexContent>
-         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *                 <sequence>
-         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-         *                   <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="Relation" maxOccurs="unbounded" minOccurs="0">
-         *                     <complexType>
-         *                       <complexContent>
-         *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *                           <sequence>
-         *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                             <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                             <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                             <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                             <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                           </sequence>
-         *                           <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *                         </restriction>
-         *                       </complexContent>
-         *                     </complexType>
-         *                   </element>
-         *                 </sequence>
-         *               </restriction>
-         *             </complexContent>
-         *           </complexType>
-         *         </element>
-         *         <element name="Interface-ref" maxOccurs="unbounded" minOccurs="0">
-         *           <complexType>
-         *             <complexContent>
-         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *                 <sequence>
-         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-         *                   <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-         *                 </sequence>
-         *               </restriction>
-         *             </complexContent>
-         *           </complexType>
-         *         </element>
-         *       </sequence>
-         *       <attribute name="Reference-type" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *       <attribute name="Object-identifier" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *     </restriction>
-         *   </complexContent>
-         * </complexType>
+         * <complexType>
+         *   <complexContent>
+         *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *       <sequence>
+         *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *         <element name="File-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *         <element name="Line-num" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *         <element name="Object-context" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *         <element name="Access-mode" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *         <element name="Data-member-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *         <element name="Temp-ref" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *         <element name="Detail" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *         <element name="Is-static" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *         <element name="Is-abstract" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *         <element name="Class-ref" maxOccurs="unbounded" minOccurs="0">
+         *           <complexType>
+         *             <complexContent>
+         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *                 <sequence>
+         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *                   <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *                   <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *                 </sequence>
+         *               </restriction>
+         *             </complexContent>
+         *           </complexType>
+         *         </element>
+         *         <element name="String-ref" maxOccurs="unbounded" minOccurs="0">
+         *           <complexType>
+         *             <complexContent>
+         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *                 <sequence>
+         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *                 </sequence>
+         *               </restriction>
+         *             </complexContent>
+         *           </complexType>
+         *         </element>
+         *         <element name="Parameter-ref" maxOccurs="unbounded" minOccurs="0">
+         *           <complexType>
+         *             <complexContent>
+         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *                 <sequence>
+         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *                   <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                 </sequence>
+         *                 <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
+         *                 <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *                 <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *                 <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *               </restriction>
+         *             </complexContent>
+         *           </complexType>
+         *         </element>
+         *         <element name="Dataset-ref" maxOccurs="unbounded" minOccurs="0">
+         *           <complexType>
+         *             <complexContent>
+         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *                 <sequence>
+         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+         *                   <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="Relation" maxOccurs="unbounded" minOccurs="0">
+         *                     <complexType>
+         *                       <complexContent>
+         *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *                           <sequence>
+         *                             <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                             <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                             <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                             <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                             <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                           </sequence>
+         *                           <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *                         </restriction>
+         *                       </complexContent>
+         *                     </complexType>
+         *                   </element>
+         *                 </sequence>
+         *               </restriction>
+         *             </complexContent>
+         *           </complexType>
+         *         </element>
+         *         <element name="Interface-ref" maxOccurs="unbounded" minOccurs="0">
+         *           <complexType>
+         *             <complexContent>
+         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *                 <sequence>
+         *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                   <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+         *                   <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+         *                 </sequence>
+         *               </restriction>
+         *             </complexContent>
+         *           </complexType>
+         *         </element>
+         *       </sequence>
+         *       <attribute name="Reference-type" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *       <attribute name="Object-identifier" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *     </restriction>
+         *   </complexContent>
+         * </complexType>
          * 
* * @@ -1136,21 +1136,21 @@ public void setObjectIdentifier(String value) { *

The following schema fragment specifies the expected content contained within this class. * *

-             * <complexType>
-             *   <complexContent>
-             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-             *       <sequence>
-             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-             *         <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-             *         <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-             *       </sequence>
-             *     </restriction>
-             *   </complexContent>
-             * </complexType>
+             * <complexType>
+             *   <complexContent>
+             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+             *       <sequence>
+             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Implements-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Has-use-pool" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+             *         <element name="Is-final" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+             *         <element name="Is-serializable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+             *       </sequence>
+             *     </restriction>
+             *   </complexContent>
+             * </complexType>
              * 
* * @@ -1359,38 +1359,38 @@ public void setIsSerializable(Boolean value) { *

The following schema fragment specifies the expected content contained within this class. * *

-             * <complexType>
-             *   <complexContent>
-             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-             *       <sequence>
-             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-             *         <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="Relation" maxOccurs="unbounded" minOccurs="0">
-             *           <complexType>
-             *             <complexContent>
-             *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-             *                 <sequence>
-             *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *                   <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *                   <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *                   <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *                   <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *                 </sequence>
-             *                 <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *               </restriction>
-             *             </complexContent>
-             *           </complexType>
-             *         </element>
-             *       </sequence>
-             *     </restriction>
-             *   </complexContent>
-             * </complexType>
+             * <complexType>
+             *   <complexContent>
+             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+             *       <sequence>
+             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="N-uri" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="N-prefix" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Is-reference" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+             *         <element name="Buffer-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Data-links" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="Relation" maxOccurs="unbounded" minOccurs="0">
+             *           <complexType>
+             *             <complexContent>
+             *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+             *                 <sequence>
+             *                   <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *                   <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *                   <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *                   <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *                   <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *                 </sequence>
+             *                 <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+             *               </restriction>
+             *             </complexContent>
+             *           </complexType>
+             *         </element>
+             *       </sequence>
+             *     </restriction>
+             *   </complexContent>
+             * </complexType>
              * 
* * @@ -1656,20 +1656,20 @@ public List getRelation() { *

The following schema fragment specifies the expected content contained within this class. * *

-                 * <complexType>
-                 *   <complexContent>
-                 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-                 *       <sequence>
-                 *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-                 *         <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-                 *         <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-                 *         <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
-                 *         <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-                 *       </sequence>
-                 *       <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-                 *     </restriction>
-                 *   </complexContent>
-                 * </complexType>
+                 * <complexType>
+                 *   <complexContent>
+                 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+                 *       <sequence>
+                 *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+                 *         <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+                 *         <element name="Parent-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+                 *         <element name="Child-buffer-name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+                 *         <element name="Relation-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+                 *       </sequence>
+                 *       <attribute name="Relation-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+                 *     </restriction>
+                 *   </complexContent>
+                 * </complexType>
                  * 
* * @@ -1852,17 +1852,17 @@ public void setRelationName(String value) { *

The following schema fragment specifies the expected content contained within this class. * *

-             * <complexType>
-             *   <complexContent>
-             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-             *       <sequence>
-             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *       </sequence>
-             *     </restriction>
-             *   </complexContent>
-             * </complexType>
+             * <complexType>
+             *   <complexContent>
+             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+             *       <sequence>
+             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="Inherited-list" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *       </sequence>
+             *     </restriction>
+             *   </complexContent>
+             * </complexType>
              * 
* * @@ -1963,23 +1963,23 @@ public void setInheritedList(String value) { *

The following schema fragment specifies the expected content contained within this class. * *

-             * <complexType>
-             *   <complexContent>
-             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-             *       <sequence>
-             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-             *         <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *       </sequence>
-             *       <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
-             *       <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *       <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *       <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *     </restriction>
-             *   </complexContent>
-             * </complexType>
+             * <complexType>
+             *   <complexContent>
+             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+             *       <sequence>
+             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="Dimension" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="Is-append" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+             *         <element name="Dataset-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *       </sequence>
+             *       <attribute name="Order" type="{http://www.w3.org/2001/XMLSchema}int" />
+             *       <attribute name="Parameter-mode" type="{http://www.w3.org/2001/XMLSchema}string" />
+             *       <attribute name="Parameter-name" type="{http://www.w3.org/2001/XMLSchema}string" />
+             *       <attribute name="Parameter-type" type="{http://www.w3.org/2001/XMLSchema}string" />
+             *     </restriction>
+             *   </complexContent>
+             * </complexType>
              * 
* * @@ -2238,19 +2238,19 @@ public void setParameterType(String value) { *

The following schema fragment specifies the expected content contained within this class. * *

-             * <complexType>
-             *   <complexContent>
-             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-             *       <sequence>
-             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
-             *         <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
-             *         <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
-             *       </sequence>
-             *     </restriction>
-             *   </complexContent>
-             * </complexType>
+             * <complexType>
+             *   <complexContent>
+             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+             *       <sequence>
+             *         <element name="Source-guid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Ref-seq" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="Max-length" type="{http://www.w3.org/2001/XMLSchema}int"/>
+             *         <element name="Justification" type="{http://www.w3.org/2001/XMLSchema}string"/>
+             *         <element name="Translatable" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+             *       </sequence>
+             *     </restriction>
+             *   </complexContent>
+             * </complexType>
              * 
* * From 6928412ca335c8fcc499a6b8af3cd8de304fc7f0 Mon Sep 17 00:00:00 2001 From: Gilles Querret Date: Wed, 6 Nov 2019 09:45:15 +0100 Subject: [PATCH 04/47] Fix SAX parsing vulnerability --- .../openedge/sensor/OpenEdgeProparseSensor.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/openedge-plugin/src/main/java/org/sonar/plugins/openedge/sensor/OpenEdgeProparseSensor.java b/openedge-plugin/src/main/java/org/sonar/plugins/openedge/sensor/OpenEdgeProparseSensor.java index d529b9d26..bb1852ac1 100644 --- a/openedge-plugin/src/main/java/org/sonar/plugins/openedge/sensor/OpenEdgeProparseSensor.java +++ b/openedge-plugin/src/main/java/org/sonar/plugins/openedge/sensor/OpenEdgeProparseSensor.java @@ -36,6 +36,7 @@ import java.util.Map; import java.util.Map.Entry; +import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; @@ -86,6 +87,8 @@ import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; import com.google.common.base.Joiner; @@ -108,7 +111,7 @@ public class OpenEdgeProparseSensor implements Sensor { private final DocumentBuilder dBuilder; private final JAXBContext context; private final Unmarshaller unmarshaller; - private final SAXParserFactory sax; + private final SAXParserFactory saxParserFactory; // File statistics private int numFiles; @@ -132,15 +135,16 @@ public OpenEdgeProparseSensor(OpenEdgeSettings settings, OpenEdgeComponents comp this.settings = settings; this.components = components; dbFactory = DocumentBuilderFactory.newInstance(); - sax = SAXParserFactory.newInstance(); - sax.setNamespaceAware(false); + saxParserFactory = SAXParserFactory.newInstance(); + saxParserFactory.setNamespaceAware(false); try { dbFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); dBuilder = dbFactory.newDocumentBuilder(); context = JAXBContext.newInstance("com.progress.xref", CrossReference.class.getClassLoader()); unmarshaller = context.createUnmarshaller(); - } catch (ParserConfigurationException | JAXBException caught) { + } catch (ParserConfigurationException | JAXBException | SAXNotRecognizedException | SAXNotSupportedException caught) { throw new IllegalStateException(caught); } } @@ -237,7 +241,7 @@ private CrossReference jaxbXREF(File xrefFile) { long startTime = System.currentTimeMillis(); InputSource is = new InputSource( settings.useXrefFilter() ? new InvalidXMLFilterStream(settings.getXrefBytes(), inpStream) : inpStream); - XMLReader reader = sax.newSAXParser().getXMLReader(); + XMLReader reader = saxParserFactory.newSAXParser().getXMLReader(); SAXSource source = new SAXSource(reader, is); doc = (CrossReference) unmarshaller.unmarshal(source); xmlParseTime += (System.currentTimeMillis() - startTime); From 97997ed5a5acb9a902b889eb05d75672201cd683 Mon Sep 17 00:00:00 2001 From: Gilles QUERRET Date: Thu, 31 Oct 2019 15:26:37 +0100 Subject: [PATCH 05/47] SERIALIZE-NAME attribute in DEFINE PROPERTY statement --- .../main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 | 2 +- proparse/src/test/java/org/prorefactor/core/BugFixTest.java | 6 ++++++ proparse/src/test/resources/data/bugsfixed/bug47.cls | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 proparse/src/test/resources/data/bugsfixed/bug47.cls diff --git a/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 b/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 index 45b9e9020..413180f96 100644 --- a/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 +++ b/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 @@ -1949,7 +1949,7 @@ definePropertyStatement: definePropertyAs: AS datatype - ( extentPhrase2 | initialConstant | NOUNDO )* + ( extentPhrase2 | initialConstant | NOUNDO | serializeName )* ; definePropertyAccessor: diff --git a/proparse/src/test/java/org/prorefactor/core/BugFixTest.java b/proparse/src/test/java/org/prorefactor/core/BugFixTest.java index 6884c87ce..e407f33df 100644 --- a/proparse/src/test/java/org/prorefactor/core/BugFixTest.java +++ b/proparse/src/test/java/org/prorefactor/core/BugFixTest.java @@ -358,6 +358,12 @@ public void test45() { assertEquals(unit.getTopNode().queryStateHead().size(), 5); } + @Test + public void test47() { + ParseUnit unit = genericTest("bug47.cls"); + assertEquals(unit.getTopNode().queryStateHead().size(), 2); + } + // Next two tests : same exception should be thrown in both cases // @Test(expectedExceptions = {ProparseRuntimeException.class}) // public void testCache1() { diff --git a/proparse/src/test/resources/data/bugsfixed/bug47.cls b/proparse/src/test/resources/data/bugsfixed/bug47.cls new file mode 100644 index 000000000..ce6cc15b3 --- /dev/null +++ b/proparse/src/test/resources/data/bugsfixed/bug47.cls @@ -0,0 +1,3 @@ +CLASS Foobar: + DEFINE PROPERTY xxx AS CHARACTER SERIALIZE-NAME "xxx" NO-UNDO GET. SET. +END CLASS. From f45753664b96b6b5fcb4717f0b2afbbb4cf37e18 Mon Sep 17 00:00:00 2001 From: Gilles QUERRET Date: Thu, 31 Oct 2019 15:12:12 +0100 Subject: [PATCH 06/47] Browse definition without field Issue #749 --- .../main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 | 2 +- proparse/src/test/java/org/prorefactor/core/BugFixTest.java | 6 ++++++ proparse/src/test/resources/data/bugsfixed/bug46.p | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 proparse/src/test/resources/data/bugsfixed/bug46.p diff --git a/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 b/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 index 413180f96..be43b54d4 100644 --- a/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 +++ b/proparse/src/main/antlr4/org/prorefactor/proparse/antlr4/Proparse.g4 @@ -1693,7 +1693,7 @@ defineBrowseStatement: ; defBrowseDisplay: - DISPLAY defBrowseDisplayItemsOrRecord exceptFields? + DISPLAY defBrowseDisplayItemsOrRecord? exceptFields? ; defBrowseDisplayItemsOrRecord: diff --git a/proparse/src/test/java/org/prorefactor/core/BugFixTest.java b/proparse/src/test/java/org/prorefactor/core/BugFixTest.java index e407f33df..4eeade6d6 100644 --- a/proparse/src/test/java/org/prorefactor/core/BugFixTest.java +++ b/proparse/src/test/java/org/prorefactor/core/BugFixTest.java @@ -358,6 +358,12 @@ public void test45() { assertEquals(unit.getTopNode().queryStateHead().size(), 5); } + @Test + public void test46() { + ParseUnit unit = genericTest("bug46.p"); + assertEquals(unit.getTopNode().queryStateHead().size(), 1); + } + @Test public void test47() { ParseUnit unit = genericTest("bug47.cls"); diff --git a/proparse/src/test/resources/data/bugsfixed/bug46.p b/proparse/src/test/resources/data/bugsfixed/bug46.p new file mode 100644 index 000000000..a88f37cd4 --- /dev/null +++ b/proparse/src/test/resources/data/bugsfixed/bug46.p @@ -0,0 +1,4 @@ +DEFINE BROWSE BROWSE-Suche + QUERY BROWSE-Suche DISPLAY + WITH NO-ROW-MARKERS SEPARATORS SIZE 85.72 BY 13.23 + FONT 4 EXPANDABLE. From 81159a991f98c46142d38c5c2555bd97ec21b47f Mon Sep 17 00:00:00 2001 From: Gilles Querret Date: Thu, 7 Nov 2019 15:39:20 +0100 Subject: [PATCH 07/47] Merge MultiChannelTokenSource code in ProToken --- .../java/org/prorefactor/core/ProToken.java | 33 ++++-- .../antlr4/MultiChannelTokenSource.java | 101 ------------------ .../proparse/antlr4/ProgressLexer.java | 3 +- .../java/org/prorefactor/core/LexerTest.java | 7 +- 4 files changed, 29 insertions(+), 115 deletions(-) delete mode 100644 proparse/src/main/java/org/prorefactor/proparse/antlr4/MultiChannelTokenSource.java diff --git a/proparse/src/main/java/org/prorefactor/core/ProToken.java b/proparse/src/main/java/org/prorefactor/core/ProToken.java index 4384e8e96..ba07aaee4 100644 --- a/proparse/src/main/java/org/prorefactor/core/ProToken.java +++ b/proparse/src/main/java/org/prorefactor/core/ProToken.java @@ -28,6 +28,11 @@ public class ProToken implements Token { private static final String INVALID_TYPE = "Invalid type number "; + // All preprocessor statements (&MESSAGE, &ANALYZE-SUSPEND and RESUME, &GLOBAL/SCOPED DEFINE and &UNDEFINE) go to this channel + public static final int PREPROCESSOR_CHANNEL = 2; + // All &_PROPARSE statements go to this channel + public static final int PROPARSE_CHANNEL = 3; + private ABLNodeType type; private int line; private int charPositionInLine = 0; @@ -261,7 +266,6 @@ public static class Builder { private int endFileIndex; private String fileName; - private int channel = DEFAULT_CHANNEL; private int macroSourceNum; private String analyzeSuspend = null; @@ -279,7 +283,6 @@ public Builder(ProToken token) { this.text = new StringBuilder(token.text); this.line = token.line; this.charPositionInLine = token.charPositionInLine; - this.channel = token.channel; this.fileIndex = token.fileIndex; this.endFileIndex = token.endFileIndex; this.fileName = token.fileName; @@ -332,11 +335,6 @@ public Builder setFileName(String fileName) { return this; } - public Builder setChannel(int channel) { - this.channel = channel; - return this; - } - public Builder setMacroSourceNum(int macroSourceNum) { this.macroSourceNum = macroSourceNum; return this; @@ -398,13 +396,32 @@ public ProToken build() { tok.fileIndex = fileIndex; tok.endFileIndex = endFileIndex; tok.fileName = fileName; - tok.channel = channel; tok.macroSourceNum = macroSourceNum; tok.macroExpansion = macroExpansion; tok.analyzeSuspend = analyzeSuspend; tok.hiddenBefore = hiddenBefore; tok.synthetic = synthetic; + switch (type) { + case COMMENT: + case WS: + tok.channel = Token.HIDDEN_CHANNEL; + break; + case AMPMESSAGE: + case AMPANALYZESUSPEND: + case AMPANALYZERESUME: + case AMPGLOBALDEFINE: + case AMPSCOPEDDEFINE: + case AMPUNDEFINE: + case INCLUDEDIRECTIVE: + tok.channel = PREPROCESSOR_CHANNEL; + break; + case PROPARSEDIRECTIVE: + tok.channel = PROPARSE_CHANNEL; + break; + default: + } + return tok; } } diff --git a/proparse/src/main/java/org/prorefactor/proparse/antlr4/MultiChannelTokenSource.java b/proparse/src/main/java/org/prorefactor/proparse/antlr4/MultiChannelTokenSource.java deleted file mode 100644 index 5d7295ffd..000000000 --- a/proparse/src/main/java/org/prorefactor/proparse/antlr4/MultiChannelTokenSource.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2015-2019 Riverside Software - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License, v. 2.0 are satisfied: GNU Lesser General Public License v3.0 - * which is available at https://www.gnu.org/licenses/lgpl-3.0.txt - * - * SPDX-License-Identifier: EPL-2.0 OR LGPL-3.0 - ********************************************************************************/ -package org.prorefactor.proparse.antlr4; - -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.IntStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenFactory; -import org.antlr.v4.runtime.TokenSource; -import org.prorefactor.core.ProToken; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Last layer of TokenSource, used to dispatch preprocessor statements, comments and whitespaces to the right channel - */ -public class MultiChannelTokenSource implements TokenSource { - private static final Logger LOGGER = LoggerFactory.getLogger(MultiChannelTokenSource.class); - - // All preprocessor statements (&MESSAGE, &ANALYZE-SUSPEND and RESUME, &GLOBAL/SCOPED DEFINE and &UNDEFINE) go to this channel - public static final int PREPROCESSOR_CHANNEL = 2; - // All &_PROPARSE statements go to this channel - public static final int PROPARSE_CHANNEL = 3; - - private final TokenSource source; - private Token currentToken; - - public MultiChannelTokenSource(TokenSource input) { - this.source = input; - } - - @Override - public Token nextToken() { - LOGGER.trace("Entering nextToken()"); - currentToken = source.nextToken(); - switch (currentToken.getType()) { - case PreprocessorParser.COMMENT: - case PreprocessorParser.WS: - ((ProToken) currentToken).setChannel(Token.HIDDEN_CHANNEL); - break; - case PreprocessorParser.AMPMESSAGE: - case PreprocessorParser.AMPANALYZESUSPEND: - case PreprocessorParser.AMPANALYZERESUME: - case PreprocessorParser.AMPGLOBALDEFINE: - case PreprocessorParser.AMPSCOPEDDEFINE: - case PreprocessorParser.AMPUNDEFINE: - case PreprocessorParser.INCLUDEDIRECTIVE: - ((ProToken) currentToken).setChannel(PREPROCESSOR_CHANNEL); - break; - case PreprocessorParser.PROPARSEDIRECTIVE: - ((ProToken) currentToken).setChannel(PROPARSE_CHANNEL); - break; - default: - } - - return currentToken; - } - - @Override - public int getLine() { - return currentToken.getLine(); - } - - @Override - public int getCharPositionInLine() { - return currentToken.getCharPositionInLine(); - } - - @Override - public CharStream getInputStream() { - return currentToken.getInputStream(); - } - - @Override - public String getSourceName() { - return IntStream.UNKNOWN_SOURCE_NAME; - } - - @Override - public void setTokenFactory(TokenFactory factory) { - throw new UnsupportedOperationException("Unable to change TokenFactory object"); - } - - @Override - public TokenFactory getTokenFactory() { - return source.getTokenFactory(); - } - -} diff --git a/proparse/src/main/java/org/prorefactor/proparse/antlr4/ProgressLexer.java b/proparse/src/main/java/org/prorefactor/proparse/antlr4/ProgressLexer.java index fab26660e..47b22f700 100644 --- a/proparse/src/main/java/org/prorefactor/proparse/antlr4/ProgressLexer.java +++ b/proparse/src/main/java/org/prorefactor/proparse/antlr4/ProgressLexer.java @@ -165,8 +165,7 @@ public ProgressLexer(RefactorSession session, ByteSource src, String fileName, b TokenSource postlexer = lexOnly ? new NoOpPostLexer(lexer) : new PostLexer(lexer); TokenSource filter0 = new NameDotTokenFilter(postlexer); TokenSource filter1 = new TokenList(filter0); - TokenSource filter2 = new MultiChannelTokenSource(filter1); - wrapper = new FunctionKeywordTokenFilter(filter2); + wrapper = new FunctionKeywordTokenFilter(filter1); } /** diff --git a/proparse/src/test/java/org/prorefactor/core/LexerTest.java b/proparse/src/test/java/org/prorefactor/core/LexerTest.java index a529244da..c7358e2dc 100644 --- a/proparse/src/test/java/org/prorefactor/core/LexerTest.java +++ b/proparse/src/test/java/org/prorefactor/core/LexerTest.java @@ -31,7 +31,6 @@ import org.prorefactor.core.schema.Schema; import org.prorefactor.core.util.UnitTestModule; import org.prorefactor.core.util.UnitTestWindowsModule; -import org.prorefactor.proparse.antlr4.MultiChannelTokenSource; import org.prorefactor.proparse.antlr4.Proparse; import org.prorefactor.refactor.RefactorSession; import org.prorefactor.refactor.settings.ProparseSettings; @@ -830,7 +829,7 @@ public void testProparseDirectiveLexPhase() { ProToken tok = (ProToken) stream.nextToken(); assertEquals(tok.getNodeType(), ABLNodeType.PROPARSEDIRECTIVE); - assertEquals(tok.getChannel(), MultiChannelTokenSource.PROPARSE_CHANNEL); + assertEquals(tok.getChannel(), ProToken.PROPARSE_CHANNEL); tok = (ProToken) stream.nextToken(); assertEquals(tok.getNodeType(), ABLNodeType.WS); assertEquals(tok.getChannel(), Token.HIDDEN_CHANNEL); @@ -848,7 +847,7 @@ public void testProparseDirectiveLexPhase() { tok = (ProToken) stream.nextToken(); tok = (ProToken) stream.nextToken(); assertEquals(tok.getNodeType(), ABLNodeType.PROPARSEDIRECTIVE); - assertEquals(tok.getChannel(), MultiChannelTokenSource.PROPARSE_CHANNEL); + assertEquals(tok.getChannel(), ProToken.PROPARSE_CHANNEL); tok = (ProToken) stream.nextToken(); tok = (ProToken) stream.nextToken(); assertEquals(tok.getNodeType(), ABLNodeType.ID); @@ -865,7 +864,7 @@ public void testProparseDirectiveLexPhase() { tok = (ProToken) stream.nextToken(); tok = (ProToken) stream.nextToken(); assertEquals(tok.getNodeType(), ABLNodeType.PROPARSEDIRECTIVE); - assertEquals(tok.getChannel(), MultiChannelTokenSource.PROPARSE_CHANNEL); + assertEquals(tok.getChannel(), ProToken.PROPARSE_CHANNEL); tok = (ProToken) stream.nextToken(); tok = (ProToken) stream.nextToken(); assertEquals(tok.getNodeType(), ABLNodeType.ID); From d9c6eaae59fd1b780229200ba61aa4825625759f Mon Sep 17 00:00:00 2001 From: Gilles Querret Date: Fri, 8 Nov 2019 09:21:04 +0100 Subject: [PATCH 08/47] JPNode refactoring Store list of children instead of just storing down and right --- .../java/org/prorefactor/core/JPNode.java | 219 +- .../prorefactor/core/nodetypes/BlockNode.java | 4 +- .../core/nodetypes/FieldRefNode.java | 4 +- .../core/nodetypes/ProgramRootNode.java | 5 +- .../core/nodetypes/RecordNameNode.java | 4 +- .../java/org/prorefactor/core/BugFixTest.java | 6 + .../data/bugsfixed/tooManyStatements.p | 5002 +++++++++++++++++ 7 files changed, 5126 insertions(+), 118 deletions(-) create mode 100644 proparse/src/test/resources/data/bugsfixed/tooManyStatements.p diff --git a/proparse/src/main/java/org/prorefactor/core/JPNode.java b/proparse/src/main/java/org/prorefactor/core/JPNode.java index 3a4df14c1..54e335da7 100644 --- a/proparse/src/main/java/org/prorefactor/core/JPNode.java +++ b/proparse/src/main/java/org/prorefactor/core/JPNode.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.Map; +import javax.annotation.Nullable; + import org.antlr.v4.runtime.tree.ParseTree; import org.prorefactor.core.nodetypes.BlockNode; import org.prorefactor.core.nodetypes.FieldRefNode; @@ -27,7 +29,6 @@ import org.prorefactor.core.nodetypes.RecordNameNode; import org.prorefactor.proparse.ParserSupport; import org.prorefactor.proparse.SymbolScope.FieldType; -import org.prorefactor.proparse.antlr4.AST; import org.prorefactor.treeparser.symbols.FieldContainer; import org.prorefactor.treeparser.symbols.ISymbol; import org.prorefactor.treeparser.symbols.Symbol; @@ -37,15 +38,14 @@ import com.google.common.collect.HashBiMap; /** - * ANTLR4 version of JPNode. + * TreeNode */ -public class JPNode implements AST { - private ProToken token; - - private JPNode down; - private JPNode right; - private JPNode left; - private JPNode up; +public class JPNode { + private final ProToken token; + private final JPNode parent; + private final int childNum; + @Nullable + private final List children; private Map attrMap; private Map attrMapStrings; @@ -65,73 +65,11 @@ public class JPNode implements AST { } } - - protected JPNode(ProToken t) { - this.token = t; - } - - // ************* - // AST interface - // ************* - - public void addChild(AST child) { - if (child == null) - return; - JPNode node = down; - if (node != null) { - while (node.right != null) { - node = node.right; - } - node.right = (JPNode) child; - } else { - down = (JPNode) child; - } - } - - @Override - public int getNumberOfChildren() { - int n = 0; - JPNode node = down; - if (node != null) { - n = 1; - while (node.right != null) { - node = node.right; - n++; - } - return n; - } - return n; - } - - - @Override - public JPNode getFirstChild() { - return down; - } - - @Override - public JPNode getNextSibling() { - return right; - } - - @Override - public String getText() { - return token.getText(); - } - - @Override - public int getType() { - return token.getNodeType().getType(); - } - - @Override - public int getLine() { - return token.getLine(); - } - - @Override - public int getColumn() { - return token.getCharPositionInLine(); + protected JPNode(ProToken token, JPNode parent, int num, boolean hasChildren) { + this.token = token; + this.parent = parent; + this.childNum = num; + this.children = hasChildren ? new ArrayList<>() : null; } // ******************** @@ -140,33 +78,79 @@ public int getColumn() { // Attributes from ProToken + /** + * @see ProToken#getText() + */ + public String getText() { + return token.getText(); + } + + /** + * @see ProToken#getNodeType() + */ public ABLNodeType getNodeType() { return token.getNodeType(); } /** - * Source number in the macro tree. + * @see ProToken#getType() + */ + public int getType() { + return token.getNodeType().getType(); + } + + /** + * @see ProToken#getMacroSourceNum() */ public int getSourceNum() { return token.getMacroSourceNum(); } + /** + * @see ProToken#getLine() + */ + public int getLine() { + return token.getLine(); + } + + /** + * @see ProToken#getEndLine() + */ public int getEndLine() { return token.getEndLine(); } + /** + * @see ProToken#getColumn() + */ + public int getColumn() { + return token.getCharPositionInLine(); + } + + /** + * @see ProToken#getEndColumn() + */ public int getEndColumn() { return token.getEndCharPositionInLine(); } + /** + * @see ProToken#getFileIndex() + */ public int getFileIndex() { return token.getFileIndex(); } + /** + * @see ProToken#getFileName() + */ public String getFileName() { return token.getFileName(); } + /** + * @see ProToken#getEndFileIndex() + */ public int getEndFileIndex() { return token.getEndFileIndex(); } @@ -186,16 +170,32 @@ public String getAnalyzeSuspend() { // ****************** // Navigation methods // ****************** + + private List getChildren() { + return children == null ? new ArrayList<>() : children; + } + + public int getNumberOfChildren() { + return children == null ? 0 : children.size(); + } + + public JPNode getFirstChild() { + return children == null || children.isEmpty() ? null : children.get(0); + } + + public JPNode getNextSibling() { + return (parent != null) && (parent.getChildren().size() > childNum + 1) ? parent.getChildren().get(childNum + 1) : null; + } public JPNode getParent() { - return up; + return parent; } /** * @return Previous sibling in line before this one */ public JPNode getPreviousSibling() { - return left; + return (childNum > 0) && (parent != null) ? parent.getChildren().get(childNum - 1) : null; } /** @@ -205,7 +205,7 @@ public JPNode getPreviousSibling() { public JPNode firstNaturalChild() { if (token.isNatural()) return this; - for (JPNode n = down; n != null; n = n.down) { + for (JPNode n = getFirstChild(); n != null; n = n.getFirstChild()) { if (n.token.isNatural()) return n; } @@ -216,27 +216,23 @@ public JPNode firstNaturalChild() { * @return Last child of the last child of the... */ public JPNode getLastDescendant() { - if (down == null) + if (children == null || children.isEmpty()) return this; - JPNode node = down; - while (node.right != null) { - node = node.right; - } - return node.getLastDescendant(); + return children.get(children.size() - 1).getLastDescendant(); } /** * @return First child if there is one, otherwise next sibling */ public JPNode nextNode() { - return (down == null ? right : down); + return children == null || children.isEmpty() ? getNextSibling() : children.get(0); } /** * @return Previous sibling if there is one, otherwise parent */ public JPNode getPreviousNode() { - return (left == null ? up : left); + return childNum > 0 ? getPreviousSibling() : getParent(); } // ************************* @@ -363,7 +359,9 @@ public ProToken findFirstHiddenAfterLastDescendant() { /** Find the first direct child with a given node type. */ public JPNode findDirectChild(ABLNodeType nodeType) { - for (JPNode node = down; node != null; node = node.getNextSibling()) { + if (children == null) + return null; + for (JPNode node: children) { if (node.getNodeType() == nodeType) return node; } @@ -512,7 +510,7 @@ public boolean hasProparseDirective(String directive) { // If token has been generated by the parser (ie synthetic token), then we look for hidden token attached to the // first child if (token.isSynthetic()) { - JPNode child = down; + JPNode child = getFirstChild(); if ((child != null) && (child.hasProparseDirective(directive))) { return true; } @@ -624,7 +622,7 @@ public String getAnnotationName() { if (getNodeType() != ABLNodeType.ANNOTATION) return ""; StringBuilder annName = new StringBuilder(token.getText().substring(1)); - JPNode tok = down; + JPNode tok = getFirstChild(); while ((tok != null) && (tok.getNodeType() != ABLNodeType.PERIOD) && (tok.getNodeType() != ABLNodeType.LEFTPAREN)) { annName.append(tok.getText()); tok = tok.getNextSibling(); @@ -944,26 +942,27 @@ public Builder moveRightToDown() { } public JPNode build(ParserSupport support) { - return build(support, null, null); + return build(support, null, 0); } - private JPNode build(ParserSupport support, JPNode up, JPNode left) { + private JPNode build(ParserSupport support, JPNode up, int num) { JPNode node; + boolean hasChildren = (down != null) && ((down.getNodeType() != ABLNodeType.EMPTY_NODE) || down.right != null || down.down != null); switch (tok.getNodeType()) { case EMPTY_NODE: throw new IllegalStateException("Empty node can't generate JPNode"); case RECORD_NAME: - node = new RecordNameNode(tok); + node = new RecordNameNode(tok, up, num, hasChildren); break; case FIELD_REF: - node = new FieldRefNode(tok); + node = new FieldRefNode(tok, up, num, hasChildren); break; case PROGRAM_ROOT: - node = new ProgramRootNode(tok); + node = new ProgramRootNode(tok, up, num, hasChildren); break; case FOR: // FOR in 'DEFINE BUFFER x FOR y' is not a BlockNode - node = stmt ? new BlockNode(tok) : new JPNode(tok); + node = stmt ? new BlockNode(tok, up, num, hasChildren) : new JPNode(tok, up, num, hasChildren); break; case DO: case REPEAT: @@ -977,14 +976,12 @@ private JPNode build(ParserSupport support, JPNode up, JPNode left) { case ON: case PROPERTY_GETTER: case PROPERTY_SETTER: - node = new BlockNode(tok); + node = new BlockNode(tok, up, num, hasChildren); break; default: - node = new JPNode(tok); + node = new JPNode(tok, up, num, hasChildren); break; } - node.up = up; - node.left = left; if (className != null) node.attrSet(IConstants.QUALIFIED_CLASS_INT, className); @@ -1015,6 +1012,7 @@ private JPNode build(ParserSupport support, JPNode up, JPNode left) { support.pushNode(ctx, node); // Attach first non-empty builder node to node.down Builder tmp = down; + Builder tmpRight = null; while (tmp != null) { if (tmp.getNodeType() == ABLNodeType.EMPTY_NODE) { // Safety net: EMPTY_NODE can't have children @@ -1023,22 +1021,23 @@ private JPNode build(ParserSupport support, JPNode up, JPNode left) { } tmp = tmp.right; } else { - node.down = tmp.build(support, node, null); + node.children.add(tmp.build(support, node, 0)); + tmpRight = tmp.right; tmp = null; } } + int numCh = 1; // Same for node.right - tmp = right; - while (tmp != null) { - if (tmp.getNodeType() == ABLNodeType.EMPTY_NODE) { + while (tmpRight != null) { + if (tmpRight.getNodeType() == ABLNodeType.EMPTY_NODE) { // Safety net: EMPTY_NODE can't have children - if (tmp.down != null) { - throw new IllegalStateException("Found EMPTY_NODE with children (first is " + tmp.down.getNodeType()); + if (tmpRight.down != null) { + throw new IllegalStateException("Found EMPTY_NODE with children (first is " + tmpRight.down.getNodeType()); } - tmp = tmp.right; + tmpRight = tmpRight.right; } else { - node.right = tmp.build(support, up, node); - tmp = null; + node.children.add(tmpRight.build(support, node, numCh++)); + tmpRight = tmpRight.right; } } diff --git a/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java index 667c56fb1..f0311d930 100644 --- a/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java @@ -28,8 +28,8 @@ * METHOD, CANFIND, CATCH, ON, PROPERTY_GETTER, PROPERTY_SETTER */ public class BlockNode extends JPNode { - public BlockNode(ProToken t) { - super(t); + public BlockNode(ProToken t, JPNode parent, int num, boolean hasChildren) { + super(t, parent, num, hasChildren); } @Nullable diff --git a/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java index 40fcf5912..c8020d1c3 100644 --- a/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java @@ -27,8 +27,8 @@ import org.prorefactor.treeparser.Primative; public class FieldRefNode extends JPNode { - public FieldRefNode(ProToken t) { - super(t); + public FieldRefNode(ProToken t, JPNode parent, int num, boolean hasChildren) { + super(t, parent, num, hasChildren); } /** diff --git a/proparse/src/main/java/org/prorefactor/core/nodetypes/ProgramRootNode.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/ProgramRootNode.java index cd4da7a0b..f7ca80538 100644 --- a/proparse/src/main/java/org/prorefactor/core/nodetypes/ProgramRootNode.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/ProgramRootNode.java @@ -15,11 +15,12 @@ ********************************************************************************/ package org.prorefactor.core.nodetypes; +import org.prorefactor.core.JPNode; import org.prorefactor.core.ProToken; public class ProgramRootNode extends BlockNode { - public ProgramRootNode(ProToken t) { - super(t); + public ProgramRootNode(ProToken t, JPNode parent, int num, boolean hasChildren) { + super(t, parent, num, hasChildren); } } diff --git a/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java index bbc41d3a0..3f0c734e7 100644 --- a/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java @@ -28,8 +28,8 @@ import com.google.common.base.Strings; public class RecordNameNode extends JPNode { - public RecordNameNode(ProToken t) { - super(t); + public RecordNameNode(ProToken t, JPNode parent, int num, boolean hasChildren) { + super(t, parent, num, hasChildren); } @Nullable diff --git a/proparse/src/test/java/org/prorefactor/core/BugFixTest.java b/proparse/src/test/java/org/prorefactor/core/BugFixTest.java index 4eeade6d6..af84a8f6f 100644 --- a/proparse/src/test/java/org/prorefactor/core/BugFixTest.java +++ b/proparse/src/test/java/org/prorefactor/core/BugFixTest.java @@ -620,4 +620,10 @@ public void testOptionsField() { genericTest("options_field.p"); } + @Test + public void testTooManyStatements() { + // Verifies that lots of statements (5000 here) don't raise a stack overflow exception + genericTest("tooManyStatements.p"); + } + } diff --git a/proparse/src/test/resources/data/bugsfixed/tooManyStatements.p b/proparse/src/test/resources/data/bugsfixed/tooManyStatements.p new file mode 100644 index 000000000..f7ddfb408 --- /dev/null +++ b/proparse/src/test/resources/data/bugsfixed/tooManyStatements.p @@ -0,0 +1,5002 @@ +procedure TooManyStatements: + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". + message "Hello World". +end procedure. From 9dc7b528f0b18494b6e4c70665241516b73341f1 Mon Sep 17 00:00:00 2001 From: Gilles Querret Date: Fri, 8 Nov 2019 09:45:41 +0100 Subject: [PATCH 09/47] JPNode cleanup --- .../org/prorefactor/core/AttributeKey.java | 40 --- .../java/org/prorefactor/core/IConstants.java | 45 +--- .../java/org/prorefactor/core/JPNode.java | 228 +++++------------- .../prorefactor/core/nodetypes/BlockNode.java | 9 +- .../core/nodetypes/FieldRefNode.java | 25 +- .../core/nodetypes/RecordNameNode.java | 45 ++-- .../TypeNameNode.java} | 32 ++- .../prorefactor/proparse/ParserSupport.java | 14 +- .../proparse/antlr4/FrameStack.java | 7 +- .../proparse/antlr4/JPNodeLister.java | 6 +- .../proparse/antlr4/TreeNodeLister.java | 8 +- .../proparse/antlr4/TreeParser.java | 18 +- .../prorefactor/treeparser/BufferScope.java | 3 +- .../prorefactor/treeparser/ClassSupport.java | 37 --- .../org/prorefactor/treeparser/ParseUnit.java | 4 +- .../java/org/prorefactor/core/BugFixTest.java | 8 +- .../java/org/prorefactor/core/JPNodeTest.java | 15 +- .../core/util/AttributedWriter.java | 4 +- 18 files changed, 164 insertions(+), 384 deletions(-) delete mode 100644 proparse/src/main/java/org/prorefactor/core/AttributeKey.java rename proparse/src/main/java/org/prorefactor/core/{AttributeValue.java => nodetypes/TypeNameNode.java} (62%) delete mode 100644 proparse/src/main/java/org/prorefactor/treeparser/ClassSupport.java diff --git a/proparse/src/main/java/org/prorefactor/core/AttributeKey.java b/proparse/src/main/java/org/prorefactor/core/AttributeKey.java deleted file mode 100644 index 12cc4fd45..000000000 --- a/proparse/src/main/java/org/prorefactor/core/AttributeKey.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2015-2019 Riverside Software - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License, v. 2.0 are satisfied: GNU Lesser General Public License v3.0 - * which is available at https://www.gnu.org/licenses/lgpl-3.0.txt - * - * SPDX-License-Identifier: EPL-2.0 OR LGPL-3.0 - ********************************************************************************/ -package org.prorefactor.core; - -public enum AttributeKey { - STORETYPE(IConstants.STORETYPE), - OPERATOR(IConstants.OPERATOR), - STATE2(IConstants.STATE2), - STATEHEAD(IConstants.STATEHEAD), - PROPARSEDIRECTIVE(IConstants.PROPARSEDIRECTIVE), - ABBREVIATED(IConstants.ABBREVIATED), - INLINE_VAR_DEF(IConstants.INLINE_VAR_DEF), - QUALIFIED_CLASS(IConstants.QUALIFIED_CLASS_INT); - - private int key; - - private AttributeKey(int key) { - this.key = key; - } - - public int getKey() { - return key; - } - - public String getName() { - return name().toLowerCase().replace('_', '-'); - } -} \ No newline at end of file diff --git a/proparse/src/main/java/org/prorefactor/core/IConstants.java b/proparse/src/main/java/org/prorefactor/core/IConstants.java index 050404207..520dd17ec 100644 --- a/proparse/src/main/java/org/prorefactor/core/IConstants.java +++ b/proparse/src/main/java/org/prorefactor/core/IConstants.java @@ -41,9 +41,9 @@ public class IConstants { /** * For attribute key "storetype", this attribute value indicates that the reference is to a local variable within the - * 4gl compile unit. This node attribute is set by TreeParser01. + * 4gl compile unit. This node attribute is set by TreeParser. */ - public static final int ST_VAR = 1105; // belongs to TreeParser01 + public static final int ST_VAR = 1105; /** See Proparse documentation, "Node Attributes Reference". */ public static final int OPERATOR = 1200; @@ -51,8 +51,6 @@ public class IConstants { public static final int STATE2 = 1300; /** See Proparse documentation, "Node Attributes Reference". */ public static final int STATEHEAD = 1400; - /** See Proparse documentation, "Node Attributes Reference". */ - public static final int PROPARSEDIRECTIVE = 1500; // // From version 1.2 @@ -63,17 +61,6 @@ public class IConstants { /** See Proparse documentation, "Node Attributes Reference". */ public static final int INLINE_VAR_DEF = 2000; - // - // From version 1.3 - // - - /** See Proparse documentation, "Node Attributes Reference". */ - public static final int SOURCENUM = 2300; - - /** See Proparse documentation, "Node Attributes Reference". */ - public static final String QUALIFIED_CLASS_STRING = "qualified-class"; - public static final int QUALIFIED_CLASS_INT = 2400; - // // From TreeParser01 // @@ -92,21 +79,9 @@ public class IConstants { */ public static final int CONTEXT_QUALIFIER = 10160; - // - // From "org.prorefactor.refactor" - // - - /** A scanner token which is scheduled to be cut from the token list */ - public static final int TO_BE_CUT = 11010; - - // Joanju uses 49000-49999 for scratch and otherwise non-persistent attributes. - // Attributes 50000+ are reserved for non-Joanju use. - // From JPNode, to be moved into an enum /** A valid value for setLink() and getLink() */ public static final int SYMBOL = -210; - /** A valid value for setLink() and getLink() */ - public static final int TET_NODE = -211; /** * A valid value for setLink() and getLink(). Link to a BufferScope object, set by tp01 for RECORD_NAME nodes and for @@ -121,13 +96,6 @@ public class IConstants { * @see org.prorefactor.core.nodetypes.BlockNode */ public static final int BLOCK = -214; - /** A valid value for setLink() and getLink() */ - public static final int COMMENTS = -215; - /** - * A valid value for setLink() and getLink(). If this AST was constructed from another, then this is the link to the - * original. - */ - public static final int ORIGINAL = -216; /** * A valid value for setLink() and getLink(). */ @@ -136,15 +104,6 @@ public class IConstants { * A valid value for setLink() and getLink(). A link to a Call object, set by TreeParser01. */ public static final int CALL = -218; - /** - * A value for setLink() and getLink(). A link from a CLASS node to the class's superclass's syntax tree. - */ - public static final int SUPER_CLASS_TREE = -219; - /** - * A value for setLink() and getLink(). Used only for DataXferStream in ProgramRootNode.java. A link from a - * Program_root node to a copy of the array of filenames. - */ - public static final int FILE_NAME_ARRAY = -220; /** * A value fo setLink() and getLink(). Store index name used in SEARCH nodes */ diff --git a/proparse/src/main/java/org/prorefactor/core/JPNode.java b/proparse/src/main/java/org/prorefactor/core/JPNode.java index 54e335da7..f79ff82b6 100644 --- a/proparse/src/main/java/org/prorefactor/core/JPNode.java +++ b/proparse/src/main/java/org/prorefactor/core/JPNode.java @@ -27,15 +27,16 @@ import org.prorefactor.core.nodetypes.FieldRefNode; import org.prorefactor.core.nodetypes.ProgramRootNode; import org.prorefactor.core.nodetypes.RecordNameNode; +import org.prorefactor.core.nodetypes.TypeNameNode; import org.prorefactor.proparse.ParserSupport; import org.prorefactor.proparse.SymbolScope.FieldType; +import org.prorefactor.treeparser.Block; +import org.prorefactor.treeparser.BufferScope; import org.prorefactor.treeparser.symbols.FieldContainer; -import org.prorefactor.treeparser.symbols.ISymbol; import org.prorefactor.treeparser.symbols.Symbol; +import org.prorefactor.treeparser.symbols.TableBuffer; import com.google.common.base.Splitter; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; /** * TreeNode @@ -47,23 +48,12 @@ public class JPNode { @Nullable private final List children; - private Map attrMap; - private Map attrMapStrings; - private Map linkMap; - private Map stringAttributes; - - private static final BiMap attrStrEqs; + // Fields are usually set in TreeParser + private Symbol symbol; + private FieldContainer container; + private BufferScope bufferScope; - // Static class initializer. - static { - attrStrEqs = HashBiMap.create(); - for (AttributeKey attr : AttributeKey.values()) { - attrStrEqs.put(attr.getKey(), attr.getName()); - } - for (AttributeValue attr : AttributeValue.values()) { - attrStrEqs.put(attr.getKey(), attr.getName()); - } - } + private Map attrMap; protected JPNode(ProToken token, JPNode parent, int num, boolean hasChildren) { this.token = token; @@ -72,10 +62,6 @@ protected JPNode(ProToken token, JPNode parent, int num, boolean hasChildren) { this.children = hasChildren ? new ArrayList<>() : null; } - // ******************** - // End of AST interface - // ******************** - // Attributes from ProToken /** @@ -247,13 +233,7 @@ public JPNode getPreviousNode() { * Get list of the direct children of this node. */ public List getDirectChildren() { - List ret = new ArrayList<>(); - JPNode n = getFirstChild(); - while (n != null) { - ret.add(n); - n = n.getNextSibling(); - } - return ret; + return getChildren(); } /** @@ -274,8 +254,7 @@ public JPNode getFirstDirectChild(ABLNodeType type) { */ public List getDirectChildren(ABLNodeType type, ABLNodeType... types) { List ret = new ArrayList<>(); - JPNode n = getFirstChild(); - while (n != null) { + for (JPNode n : children) { if (n.getNodeType() == type) ret.add(n); if (types != null) { @@ -284,7 +263,6 @@ public List getDirectChildren(ABLNodeType type, ABLNodeType... types) { ret.add(n); } } - n = n.getNextSibling(); } return ret; } @@ -384,54 +362,17 @@ public int attrGet(int key) { switch (key) { case IConstants.ABBREVIATED: return isAbbreviated() ? 1 : 0; - case IConstants.SOURCENUM: - return token.getMacroSourceNum(); default: return 0; } } - public String attrGetS(int attrNum) { - if (attrNum != IConstants.QUALIFIED_CLASS_INT) - throw new IllegalArgumentException("Invalid value " + attrNum); - if ((stringAttributes != null) && stringAttributes.containsKey(attrNum)) { - return stringAttributes.get(attrNum); - } - return ""; - } - - public String attrGetS(String attrName) { - if (IConstants.QUALIFIED_CLASS_STRING.equalsIgnoreCase(attrName)) - throw new IllegalArgumentException("Invalid value " + attrName); - if (attrMapStrings != null) { - String ret = attrMapStrings.get(attrName); - if (ret != null) - return ret; - } - Integer intKey = attrEq(attrName); - if (intKey != null) - return attrGetS(intKey); - return ""; - } - - public void attrSet(int key, String value) { - if (stringAttributes == null) - stringAttributes = new HashMap<>(); - stringAttributes.put(key, value); - } - public void attrSet(Integer key, int val) { if (attrMap == null) initAttrMap(); attrMap.put(key, val); } - public void attrSetS(String key, String value) { - if (attrMapStrings == null) - attrMapStrings = new HashMap<>(); - attrMapStrings.put(key, value); - } - /** * Mark a node as "operator" */ @@ -439,22 +380,6 @@ public void setOperator() { attrSet(IConstants.OPERATOR, IConstants.TRUE); } - /** - * Get a link to an arbitrary object. Integers from -200 through -499 are reserved for Joanju. - */ - public Object getLink(Integer key) { - if (linkMap == null) - return null; - return linkMap.get(key); - } - - /** If this AST was constructed from another, then get the original. */ - public JPNode getOriginal() { - if (linkMap == null) - return null; - return (JPNode) linkMap.get(IConstants.ORIGINAL); - } - public int getState2() { return attrGet(IConstants.STATE2); } @@ -473,23 +398,62 @@ public void setStatementHead(int state2) { /** Certain nodes will have a link to a Symbol, set by TreeParser. */ public Symbol getSymbol() { - return (Symbol) getLink(IConstants.SYMBOL); - } - - private static Integer attrEq(String attrName) { - return attrStrEqs.inverse().get(attrName); + return symbol; } public boolean hasTableBuffer() { - return getLink(IConstants.SYMBOL) != null; + return symbol != null; } public boolean hasBufferScope() { - return getLink(IConstants.BUFFERSCOPE) != null; + return bufferScope != null; } public boolean hasBlock() { - return getLink(IConstants.BLOCK) != null; + return false; + } + + @Nullable + public Block getBlock() { + return null; + } + + public TableBuffer getTableBuffer() { + return (TableBuffer) symbol; + } + + /** + * Get the FieldContainer (Frame or Browse) for a statement head node or a frame field reference. This value is set by + * TreeParser01. Head nodes for statements with the [WITH FRAME | WITH BROWSE] option have this value set. Is also + * available on the Field_ref node for #(Field_ref INPUT ...) and for #(USING #(Field_ref...)...). + */ + public FieldContainer getFieldContainer() { + return container; + } + + public BufferScope getBufferScope() { + return bufferScope; + } + + public void setSymbol(Symbol symbol) { + this.symbol = symbol; + } + + public void setBufferScope(BufferScope scope) { + this.bufferScope = scope; + } + + /** @see #getFieldContainer() */ + public void setFieldContainer(FieldContainer fieldContainer) { + this.container = fieldContainer; + } + + public void setBlock(Block block) { + throw new IllegalArgumentException("Not a Block node"); + } + + public void setTableBuffer(TableBuffer buffer) { + setSymbol(buffer); } public boolean hasProparseDirective(String directive) { @@ -526,46 +490,6 @@ public boolean hasProparseDirective(String directive) { return false; } - /** - * Get the comments that precede this node. Gets the consecutive comments from Proparse if "connected", - * otherwise gets the comments stored within this node object. CAUTION: We want to know if line breaks exist between - * comments and nodes, and if they exist between consecutive comments. To preserve that information, the String - * returned here may have "\n" in front of the first comment, may have "\n" separating comments, and may have "\n" - * appended to the last comment. We do not preserve the number of newlines, nor do we preserve any other whitespace. - * - * @return null if no comments. - */ - public String getComments() { - String ret = (String) getLink(IConstants.COMMENTS); - if (ret != null) - return ret; - StringBuilder buff = new StringBuilder(); - boolean hasComment = false; - int filenum = getFileIndex(); - for (ProToken t = getHiddenBefore(); t != null; t = t.getHiddenBefore()) { - if (t.getFileIndex() != filenum) - break; - if (t.getNodeType() == ABLNodeType.WS) { - if (t.getText().indexOf('\n') > -1) - buff.insert(0, '\n'); - } else if (t.getNodeType() == ABLNodeType.COMMENT) { - buff.insert(0, t.getText()); - hasComment = true; - } else { - break; - } - } - return hasComment ? buff.toString() : null; - } - - /** - * Get the FieldContainer (Frame or Browse) for a statement head node or a frame field reference. This value is set by - * TreeParser01. Head nodes for statements with the [WITH FRAME | WITH BROWSE] option have this value set. Is also - * available on the Field_ref node for #(Field_ref INPUT ...) and for #(USING #(Field_ref...)...). - */ - public FieldContainer getFieldContainer() { - return (FieldContainer) getLink(IConstants.FIELD_CONTAINER); - } public ProToken getHiddenFirst() { // Some day, I'd like to change the structure for the hidden tokens, @@ -639,12 +563,6 @@ private void initAttrMap() { } } - private void initLinkMap() { - if (linkMap == null) { - linkMap = new HashMap<>(); - } - } - public boolean isAbbreviated() { return token.getNodeType().isAbbreviated(getText()); } @@ -668,31 +586,6 @@ public boolean isStateHead() { return attrGet(IConstants.STATEHEAD) == IConstants.TRUE; } - /** - * Set the comments preceding this node. CAUTION: Does not change any values in Proparse. Only use this if the JPNode - * tree is "disconnected", because getComments returns the comments from the "hidden tokens" in Proparse in - * "connected" mode. - */ - public void setComments(String comments) { - setLink(IConstants.COMMENTS, comments); - } - - /** @see #getFieldContainer() */ - public void setFieldContainer(FieldContainer fieldContainer) { - setLink(IConstants.FIELD_CONTAINER, fieldContainer); - } - - /** @see #getLink(Integer) */ - public void setLink(Integer key, Object value) { - if (linkMap == null) - initLinkMap(); - linkMap.put(key, value); - } - - /** Assigned by the tree parser. */ - public void setSymbol(ISymbol symbol) { - setLink(IConstants.SYMBOL, symbol); - } /** * Used by TreeParser in order to assign Symbol to the right node @@ -964,6 +857,9 @@ private JPNode build(ParserSupport support, JPNode up, int num) { // FOR in 'DEFINE BUFFER x FOR y' is not a BlockNode node = stmt ? new BlockNode(tok, up, num, hasChildren) : new JPNode(tok, up, num, hasChildren); break; + case TYPE_NAME: + node = new TypeNameNode(tok, up, num, hasChildren, className); + break; case DO: case REPEAT: case FUNCTION: @@ -983,8 +879,6 @@ private JPNode build(ParserSupport support, JPNode up, int num) { break; } - if (className != null) - node.attrSet(IConstants.QUALIFIED_CLASS_INT, className); if (stmt) node.setStatementHead(stmt2 == null ? 0 : stmt2.getType()); if (operator) diff --git a/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java index f0311d930..3e8864ea2 100644 --- a/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/BlockNode.java @@ -18,7 +18,6 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.prorefactor.core.IConstants; import org.prorefactor.core.JPNode; import org.prorefactor.core.ProToken; import org.prorefactor.treeparser.Block; @@ -28,17 +27,21 @@ * METHOD, CANFIND, CATCH, ON, PROPERTY_GETTER, PROPERTY_SETTER */ public class BlockNode extends JPNode { + private Block block; + public BlockNode(ProToken t, JPNode parent, int num, boolean hasChildren) { super(t, parent, num, hasChildren); } @Nullable + @Override public Block getBlock() { - return (Block) getLink(IConstants.BLOCK); + return block; } + @Override public void setBlock(@Nonnull Block block) { - setLink(IConstants.BLOCK, block); + this.block = block; } } diff --git a/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java index c8020d1c3..e3e04fef3 100644 --- a/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/FieldRefNode.java @@ -15,22 +15,28 @@ ********************************************************************************/ package org.prorefactor.core.nodetypes; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import org.prorefactor.core.ABLNodeType; -import org.prorefactor.core.IConstants; import org.prorefactor.core.JPNode; import org.prorefactor.core.ProToken; -import org.prorefactor.treeparser.BufferScope; +import org.prorefactor.treeparser.ContextQualifier; import org.prorefactor.treeparser.DataType; import org.prorefactor.treeparser.Primative; public class FieldRefNode extends JPNode { + private ContextQualifier qualifier; + public FieldRefNode(ProToken t, JPNode parent, int num, boolean hasChildren) { super(t, parent, num, hasChildren); } + public void setContextQualifier(ContextQualifier qualifier) { + this.qualifier = qualifier; + } + + public ContextQualifier getQualifier() { + return qualifier; + } + /** * Returns null if symbol is null or is a graphical component */ @@ -55,13 +61,4 @@ public JPNode getIdNode() { return findDirectChild(ABLNodeType.ID.getType()); } - @Nullable - public BufferScope getBufferScope() { - return (BufferScope) getLink(IConstants.BUFFERSCOPE); - } - - public void setBufferScope(@Nonnull BufferScope bufferScope) { - setLink(IConstants.BUFFERSCOPE, bufferScope); - } - } diff --git a/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java index 3f0c734e7..367e9e79d 100644 --- a/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/RecordNameNode.java @@ -16,50 +16,57 @@ package org.prorefactor.core.nodetypes; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.prorefactor.core.IConstants; import org.prorefactor.core.JPNode; import org.prorefactor.core.ProToken; import org.prorefactor.proparse.SymbolScope.FieldType; -import org.prorefactor.treeparser.BufferScope; -import org.prorefactor.treeparser.symbols.TableBuffer; +import org.prorefactor.treeparser.ContextQualifier; import com.google.common.base.Strings; public class RecordNameNode extends JPNode { + private String sortAccess = ""; + private boolean wholeIndex; + private String searchIndexName = ""; + private ContextQualifier qualifier; + public RecordNameNode(ProToken t, JPNode parent, int num, boolean hasChildren) { super(t, parent, num, hasChildren); } - @Nullable - public BufferScope getBufferScope() { - return (BufferScope) getLink(IConstants.BUFFERSCOPE); + public void setContextQualifier(ContextQualifier qualifier) { + this.qualifier = qualifier; + } + + public ContextQualifier getQualifier() { + return qualifier; } - @Nullable - public TableBuffer getTableBuffer() { - return (TableBuffer) getLink(IConstants.SYMBOL); + public String getSortAccess() { + return sortAccess; } - public void setBufferScope(@Nonnull BufferScope bufferScope) { - setLink(IConstants.BUFFERSCOPE, bufferScope); + public boolean isWholeIndex() { + return wholeIndex; } - public void setTableBuffer(@Nonnull TableBuffer buffer) { - setLink(IConstants.SYMBOL, buffer); + public String getSearchIndexName() { + return searchIndexName; } public void setSortAccess(String str) { if (Strings.isNullOrEmpty(str)) return; + sortAccess = sortAccess + (sortAccess.isEmpty() ? "" : ',') + str; + } - Object o = getLink(IConstants.SORT_ACCESS); - if (o != null) { - setLink(IConstants.SORT_ACCESS, o.toString() + "," + str); - } else { - setLink(IConstants.SORT_ACCESS, str); - } + public void setWholeIndex(boolean wholeIndex) { + this.wholeIndex = wholeIndex; + } + + public void setSearchIndexName(String indexName) { + this.searchIndexName = indexName; } /** Set the 'store type' attribute on a RECORD_NAME node. */ diff --git a/proparse/src/main/java/org/prorefactor/core/AttributeValue.java b/proparse/src/main/java/org/prorefactor/core/nodetypes/TypeNameNode.java similarity index 62% rename from proparse/src/main/java/org/prorefactor/core/AttributeValue.java rename to proparse/src/main/java/org/prorefactor/core/nodetypes/TypeNameNode.java index dbafaa0f3..85bcb4fa7 100644 --- a/proparse/src/main/java/org/prorefactor/core/AttributeValue.java +++ b/proparse/src/main/java/org/prorefactor/core/nodetypes/TypeNameNode.java @@ -12,27 +12,23 @@ * * SPDX-License-Identifier: EPL-2.0 OR LGPL-3.0 ********************************************************************************/ -package org.prorefactor.core; +package org.prorefactor.core.nodetypes; -public enum AttributeValue { - FALSE(IConstants.FALSE), - TRUE(IConstants.TRUE), - ST_VARIABLE(IConstants.ST_VAR), - ST_DBTABLE(IConstants.ST_DBTABLE), - ST_TTABLE(IConstants.ST_TTABLE), - ST_WTABLE(IConstants.ST_WTABLE); +import org.prorefactor.core.JPNode; +import org.prorefactor.core.ProToken; - int key; +/** + * Specialized type of JPNode for TYPE_NAME nodes + */ +public class TypeNameNode extends JPNode { + private String qualName; - private AttributeValue(int key) { - this.key = key; + public TypeNameNode(ProToken t, JPNode parent, int num, boolean hasChildren, String qualName) { + super(t, parent, num, hasChildren); + this.qualName = qualName; } - public int getKey() { - return key; + public String getQualName() { + return qualName; } - - public String getName() { - return name().toLowerCase().replace('_', '-'); - } -} \ No newline at end of file +} diff --git a/proparse/src/main/java/org/prorefactor/proparse/ParserSupport.java b/proparse/src/main/java/org/prorefactor/proparse/ParserSupport.java index 56be40e63..5aeb78e19 100644 --- a/proparse/src/main/java/org/prorefactor/proparse/ParserSupport.java +++ b/proparse/src/main/java/org/prorefactor/proparse/ParserSupport.java @@ -26,7 +26,6 @@ import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeProperty; import org.prorefactor.core.ABLNodeType; -import org.prorefactor.core.IConstants; import org.prorefactor.core.JPNode; import org.prorefactor.proparse.SymbolScope.FieldType; import org.prorefactor.proparse.antlr4.Proparse; @@ -82,7 +81,8 @@ public String getClassName() { /** * An AS phrase allows further abbreviations on the datatype names. Input a token's text, this returns 0 if it is not * a datatype abbreviation, otherwise returns the integer token type for the abbreviation. Here's the normal keyword - * abbreviation, with what AS phrase allows: