<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->
<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
<!-- for some information on what you could do (e.g. targets to override). -->
<!-- If you delete this file and reopen the project it will be recreated. -->
<project name="java/languages.antlr" default="build" basedir=".">
    <description>Builds, tests, and runs the project org.netbeans.modules.languages.antlr</description>
    <import file="../../nbbuild/templates/projectized.xml"/>

    <target name="download-antlr-grammar" depends="init">
        <property name="apache.license.header">
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

// DO NOT EDIT THIS FILE MANUALLY!
// SEE build.xml FOR INSTRUCTIONS

</property>
        <property name="antlr3.additionalheader">

@header{
${apache.license.header}
package org.antlr.parser.antlr3;

}

</property>
        <property name="antlr4.additionalheader">

@header{
${apache.license.header}
package org.antlr.parser.antlr4;

}

</property>
        <property name="antlr4.outdir" location="${src.dir}/org/antlr/parser/antlr4"/>
        <property name="antlr3.outdir" location="${src.dir}/org/antlr/parser/antlr3"/>
        <mkdir dir="${antlr3.outdir}"/>
        <mkdir dir="${antlr4.outdir}"/>

        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr3/ANTLRv3Lexer.g4" dest="${antlr3.outdir}"/>
        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr3/ANTLRv3Parser.g4" dest="${antlr3.outdir}"/>
        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr3/Java/LexerAdaptor.java" dest="${antlr3.outdir}"/>

        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/ANTLRv4Lexer.g4" dest="${antlr4.outdir}"/>
        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/ANTLRv4Parser.g4" dest="${antlr4.outdir}"/>
        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/LexBasic.g4" dest="${antlr4.outdir}"/>
        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/Java/LexerAdaptor.java" dest="${antlr4.outdir}"/>

        <replace file="${antlr3.outdir}/LexerAdaptor.java">
              <replacetoken><![CDATA[
import org.antlr.v4.runtime.CharStream;]]></replacetoken>
  <replacevalue><![CDATA[
package org.antlr.parser.antlr3;
import org.antlr.v4.runtime.CharStream;]]></replacevalue>
        </replace>
        <replace file="${antlr4.outdir}/LexerAdaptor.java" token="//package" value="package"/>

        <replaceregexp match="(parser|lexer) grammar ([^;]+);([\n\r]*)"
                       replace="\1 grammar \2;${antlr3.additionalheader}"
                       flags="g"
        >
            <fileset dir="${antlr3.outdir}" includes="ANTLRv3Parser.g4 ANTLRv3Lexer.g4" />
        </replaceregexp>

        <replaceregexp match="(parser|lexer) grammar ([^;]+);([\n\r]*)"
                       replace="\1 grammar \2;${antlr4.additionalheader}"
                       flags="g"
        >
            <fileset dir="${antlr4.outdir}" includes="ANTLRv4Parser.g4 LexBasic.g4" />
        </replaceregexp>
    </target>

    <target name="generate-antlr-parser" description="Regenerate the ANTLRv4 parser" depends="init">
        <property name="antlr3.outdir" location="${src.dir}/org/antlr/parser/antlr3"/>
        <property name="antlr4.outdir" location="${src.dir}/org/antlr/parser/antlr4"/>
        <path id="antlr4.tool">
            <fileset dir="../../ide/libs.antlr4.runtime/external" includes="*.jar"/>
            <fileset dir="../../ide/libs.antlr3.runtime/external" includes="antlr-runtime-*.jar"/>
        </path>

        <java classname="org.antlr.v4.Tool" classpathref="antlr4.tool" fork="true" dir="${antlr3.outdir}">
            <arg value="-o"/>
            <arg value="${antlr3.outdir}"/>
            <!--arg value="-package"/>
            <arg value="org.antlr.parser.antlr4"/-->
            <arg value="ANTLRv3Lexer.g4"/>
            <arg value="ANTLRv3Parser.g4"/>
        </java>

        <java classname="org.antlr.v4.Tool" classpathref="antlr4.tool" fork="true" dir="${antlr4.outdir}">
            <arg value="-o"/>
            <arg value="${antlr4.outdir}"/>
            <!--arg value="-package"/>
            <arg value="org.antlr.parser.antlr4"/-->
            <arg value="ANTLRv4Lexer.g4"/>
            <arg value="ANTLRv4Parser.g4"/>
        </java>

        <delete dir="${antlr3.outdir}" includes="*.tokens"/>
        <delete dir="${antlr3.outdir}" includes="*.interp"/>
        <delete dir="${antlr4.outdir}" includes="*.tokens"/>
        <delete dir="${antlr4.outdir}" includes="*.interp"/>
        <!--delete dir="${antlr.outdir}" includes="*.g4"/-->

    </target>
</project>
