Использование Ant scriptfilter для подсчета строк - PullRequest
2 голосов
/ 12 сентября 2010

Я пытаюсь написать Ant <scriptfilter...>, чтобы изменить вхождения строки "__LINE__" на правильный номер строки в исходных файлах Java.

У кого-нибудь есть пример использования JavaScript (или какой-то другойвстроенный язык сценариев) для этого?В частности, как мне создать «глобальную» переменную, которая инициализируется равной 1 при запуске сценария и увеличивается с каждой новой строкой?

Спасибо.

UPDATE: Только что попробовал решение, предложенное Мартином Клэйтоном (спасибо!), Заменив JavaScript на Beanshell, и оно отлично заработало.Вот целевой код муравья:

<target name="preprocess" depends="ivy.resolve" description="Preprocess the source code">
    <mkdir dir="${target.source.dir}"/>
    <copy todir="${target.source.dir}" includeemptydirs="true" failonerror="true" verbose="true">
        <fileset dir="${src.dir}"/>
        <filterchain>
            <tokenfilter>
                <filetokenizer/>
                <scriptfilter language="beanshell" byline="true" setbeans="true"><![CDATA[
                    import java.io.BufferedReader;
                    import java.io.StringReader;
                    int count = 1;
                    BufferedReader br = new BufferedReader(new StringReader(self.getToken()));
                    StringBuilder builder = new StringBuilder();
                    String line;
                    while ((line = br.readLine()) != null) {
                        builder.append(line.replace("\"__LINE__\"", Integer.toString(count))).append('\n');
                        count++;
                    }
                    self.setToken(builder.toString());
                ]]></scriptfilter>
            </tokenfilter>
        </filterchain>
    </copy>
</target>

1 Ответ

3 голосов
/ 13 сентября 2010

Вы можете использовать свойство ant для хранения «static».

Вот очень упрощенный пример для одного файла.

<property name="lineNumber" value="0" />
<copy file="input.txt" tofile="output.txt" >
    <filterchain>
        <scriptfilter language="javascript">
            project.setProperty( "lineNumber", 
                                 parseInt( project.getProperty( "lineNumber" ) ) + 1 );

            if ( self.getToken().indexOf("__LINE__") != -1 ) {
                lineNumber = project.getProperty( "lineNumber" );
                self.setToken( self.getToken( ).replaceAll( "__LINE__", lineNumber ) );
            }               
        </scriptfilter>
    </filterchain>
</copy>

Проблема в том, что это не распространяется на несколько файлов - lineNumber не переустанавливается на один между файлами.

Вы можете использовать filetokenizer, чтобы получить весь файл в javascript за один раз, а затем обработать файл построчно. Вот очень хороший пример (я знаю достаточно javascript, чтобы быть опасным). Я уверен, что у этого есть много ошибок (не в последнюю очередь: это не обрабатывает файлы без завершения строки; шокирующая цепочка строк). Но принцип заключается в том, что, помещая каждый файл в сценарий, вам не нужно сохранять информацию между вызовами сценария.

<copy todir="output">
<fileset dir="input"/>
<filterchain>
    <tokenfilter>
    <filetokenizer/>
        <scriptfilter language="javascript"><![CDATA[

            // Get the whole input file to one string.
            inputContent = self.getToken( );

            lineNum = 1;
            fileEnd = inputContent.length( );

            // Build the new file up line-by-line in this var.
            outputContent = "";

            lineStart = 0;
            lineEnd = inputContent.indexOf( "\n" );
            while ( lineEnd < fileEnd ) {
                outputContent += inputContent
                                .substring( lineStart, lineEnd )
                                .replaceAll( "__LINE__", lineNum ) + "\n";
                lineStart = lineEnd + 1;
                fc = inputContent.substring( lineStart );
                lineEnd = fc.indexOf( "\n" );
                if ( lineEnd == -1 )
                    break;  
                lineEnd += lineStart;
                lineNum++;
            }

            self.setToken( outputContent );
           ]]></scriptfilter>
    </tokenfilter>
</filterchain>
</copy>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...