Skip to content

Commit

Permalink
Merge pull request #774 from kohlschutter/ck/UpdateDependenciesAndCan…
Browse files Browse the repository at this point in the history
…dyGenerator

Update dependencies and candy generator
  • Loading branch information
renaudpawlak authored Oct 15, 2023
2 parents c520e8b + eafe6a4 commit c628192
Show file tree
Hide file tree
Showing 33 changed files with 5,760 additions and 350 deletions.
File renamed without changes.
33 changes: 33 additions & 0 deletions candy-generator-util/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.jsweet</groupId>
<artifactId>jsweet-parent</artifactId>
<version>4.0.0-SNAPSHOT</version>
<relativePath>../</relativePath>
</parent>

<artifactId>jsweet-candy-generator-util</artifactId>
<name>JSweet candy generator utilites</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>com.github.vbmacher</groupId>
<artifactId>java-cup</artifactId>
</dependency>
<dependency>
<groupId>de.jflex</groupId>
<artifactId>jflex</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
/*
* jsweet-candy-generator-util
* Copyright 2023 Christian Kohlschütter
*
* Licensed 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.
*/
package org.jsweet.candyutil.parser;

import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.function.BiFunction;
import java.util.function.Function;

/**
* Generate parsers and remove the date from the generated files so we can add them to source
* control.
*
* @author Christian Kohlschütter
*/
public class GenerateParser {
public static void main(String[] args) throws Exception {
if (args.length != 1) {
throw new IllegalArgumentException("Syntax: <path/to/src/main/java>");
}
File sourceDir = new File(args[0]);

generateJavaCupParser(sourceDir);
generateTSDefAPILexer(sourceDir);
}

private static void generateJavaCupParser(File sourceDir) throws Exception {
Path parserOutFile = Path.of("TypescriptDefParser.java");
Path symOutFile = Path.of("sym.java");
if (Files.exists(parserOutFile)) {
System.err.println("WARNING: Overwriting " + parserOutFile);
Files.delete(parserOutFile);
}
if (Files.exists(symOutFile)) {
System.err.println("WARNING: Overwriting " + symOutFile);
Files.delete(symOutFile);
}
File parserPackageDir = new File(sourceDir, "org/jsweet/input/typescriptdef/parser/");

java_cup.Main.main(new String[] {
"-expect", "0", //
"-package", "org.jsweet.input.typescriptdef.parser", //
"-parser", "TypescriptDefParser", //
new File(parserPackageDir, "typescriptdef.cup").toString(), //
//
});

if (!Files.exists(parserOutFile)) {
throw new IllegalStateException("Expected output file not created: " + parserOutFile);
}
if (!Files.exists(symOutFile)) {
throw new IllegalStateException("Expected output file not created: " + symOutFile);
}

// Remove date from the line after "The following code was generated ..."
Function<String, String> transformer = new PreviousLineAwareTransformer((p, c) -> {
if (c.startsWith("// ") && p.startsWith("// The following code was generated by ")) {
return null;
} else if (c.startsWith(" * @version ") && p.startsWith("/** CUP ")) {
return null;
}
return c;
});
moveFileAndModify(parserOutFile.toFile(), new File(parserPackageDir, parserOutFile.getName(
parserOutFile.getNameCount() - 1).toString()), transformer);
moveFileAndModify(symOutFile.toFile(), new File(parserPackageDir, symOutFile.getName(
parserOutFile.getNameCount() - 1).toString()), transformer);
}

private static void generateTSDefAPILexer(File sourceDir) throws IOException {
File typescriptDefLex = new File(sourceDir,
"org/jsweet/input/typescriptdef/parser/typescriptdef.lex");

File typescriptDefScanner = new File(sourceDir,
"org/jsweet/input/typescriptdef/parser/TypescriptDefScanner.java");

File typescriptDefScannerBackup = new File(typescriptDefScanner.toString() + "~");

jflex.Main.main(new String[] {typescriptDefLex.toString()});
Files.deleteIfExists(typescriptDefScannerBackup.toPath());

// Remove date from "The following code was generated ..."
// We cannot modify in place, so let's temporarily move it around.
Files.move(typescriptDefScanner.toPath(), typescriptDefScannerBackup.toPath());
moveFileAndModify(typescriptDefScannerBackup, typescriptDefScanner, (l) -> {
if (l.startsWith("/* The following code was generated ")) {
int i = l.indexOf(" on ");
if (i != -1) {
l = l.substring(0, i) + " */";
}
return l;
} else if (l.startsWith(" * on ") && l.endsWith(" from the specification file")) {
return null;
} else {
return l;
}
});
}

private static void moveFileAndModify(File from, File to,
Function<String, String> lineTransformer) throws IOException {
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(from),
StandardCharsets.UTF_8));
PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(to),
StandardCharsets.UTF_8))) {
String l;
while ((l = in.readLine()) != null) {
if ((l = lineTransformer.apply(l)) != null) {
out.println(l);
}
}
}
Files.delete(from.toPath());
if (lineTransformer instanceof Closeable) {
((Closeable) lineTransformer).close();
}
}

private static final class PreviousLineAwareTransformer implements Function<String, String>,
Closeable {
private final BiFunction<String, String, String> transformer;
private String previous = null;

public PreviousLineAwareTransformer(BiFunction<String, String, String> transformer) {
this.transformer = transformer;
}

@Override
public final String apply(String t) {
String current = transformer.apply(previous, t);
this.previous = current;
return current;
}

@Override
public void close() throws IOException {
this.previous = null;
}
}
}
40 changes: 0 additions & 40 deletions candy-generator/build.xml

This file was deleted.

Loading

0 comments on commit c628192

Please sign in to comment.