Dart generate keywords (#4449)

* Add script to use Dart SDK to generate keywords

* Read generated keywords in dart generator
This commit is contained in:
Nick Meinhold
2019-11-12 03:11:43 +11:00
committed by William Cheng
parent 7bfc53b3bb
commit 11bcb661a1
9 changed files with 388 additions and 15 deletions

View File

@@ -0,0 +1,20 @@
## What is the purpose?
Running `./save_dart_keywords.sh` from this directory will generate `dart-keywords.txt` which contains the current Dart keywords and is used by the dart generator as a set of reserved words.
## When should the keywords be generated?
`save_dart_keywords.sh` should be run when a new version of Dart is release to update the keywords file.
The last Dart version that was used to generate the keywords can be found in `dart-version.txt`.
## What does the shellscript do?
1. compile a dart app
- `dart2native save-dart-keywords.dart`
1. run the dart app
- `./save-dart-keywords.exe`
1. the ouput is `dart-keywords.txt` and `dart-version.txt`

View File

@@ -0,0 +1 @@
Dart VM version: 2.7.0-dev.0.0 (Tue Nov 5 12:57:33 2019 +0100) on "macos_x64"

View File

@@ -0,0 +1,194 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
_fe_analyzer_shared:
dependency: transitive
description:
name: _fe_analyzer_shared
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
analyzer:
dependency: "direct main"
description:
name: analyzer
url: "https://pub.dartlang.org"
source: hosted
version: "0.39.1"
args:
dependency: transitive
description:
name: args
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.2"
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.14.12"
convert:
dependency: transitive
description:
name: convert
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
version: "0.16.1"
front_end:
dependency: transitive
description:
name: front_end
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.29"
glob:
dependency: transitive
description:
name: glob
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
html:
dependency: transitive
description:
name: html
url: "https://pub.dartlang.org"
source: hosted
version: "0.14.0+3"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.1+1"
kernel:
dependency: transitive
description:
name: kernel
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.29"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.8"
node_interop:
dependency: transitive
description:
name: node_interop
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
node_io:
dependency: transitive
description:
name: node_io
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1+2"
package_config:
dependency: transitive
description:
name: package_config
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.4"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0+1"
pub_semver:
dependency: transitive
description:
name: pub_semver
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.2"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.5"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.6"
watcher:
dependency: transitive
description:
name: watcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.9.7+12"
yaml:
dependency: transitive
description:
name: yaml
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
sdks:
dart: ">=2.6.0 <3.0.0"

View File

@@ -0,0 +1,10 @@
name: dart_keywords
description: Use the Dart SDK to generate Dart keywords.
version: 1.0.0+1
environment:
sdk: ">=2.6.0 <3.0.0"
dependencies:
analyzer:

View File

@@ -0,0 +1,16 @@
import 'dart:io';
import 'package:analyzer/dart/ast/token.dart';
main() {
// save keywords to a text file
final txtFile = File(
'../../../modules/openapi-generator/src/main/resources/dart/dart-keywords.txt');
String txtString = '';
for (String keyword in Keyword.keywords.keys.toList()) {
txtString += keyword + '\n';
}
txtString =
txtString.substring(0, txtString.length - 1); // remove last newline
txtFile.writeAsStringSync(txtString);
}

View File

@@ -0,0 +1,3 @@
dart2native save-dart-keywords.dart
./save-dart-keywords.exe
dart --version &> dart-version.txt

View File

@@ -26,12 +26,47 @@ import org.openapitools.codegen.utils.ModelUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.*;
import static org.openapitools.codegen.utils.StringUtils.camelize;
import static org.openapitools.codegen.utils.StringUtils.underscore;
// import static org.openapitools.codegen.utils.StringUtils.camelize;
// import static org.openapitools.codegen.utils.StringUtils.underscore;
// import java.io.BufferedReader;
// import java.io.File;
// import java.io.FileInputStream;
// import java.io.InputStreamReader;
// import java.nio.charset.Charset;
// import java.util.ArrayList;
// import java.util.Arrays;
// import java.util.HashMap;
// import java.util.HashSet;
// import java.util.List;
// import java.util.Map;
// import java.util.Set;
// import javax.xml.validation.Schema;
// import org.apache.commons.io.FilenameUtils;
// import org.openapitools.codegen.CodegenConfig;
// import org.openapitools.codegen.CodegenConstants;
// import org.openapitools.codegen.CodegenModel;
// import org.openapitools.codegen.CodegenProperty;
// import org.openapitools.codegen.CodegenType;
// import org.openapitools.codegen.DefaultCodegen;
// import org.openapitools.codegen.utils.ModelUtils;
// import org.openapitools.codegen.utils.StringUtils;
// import org.slf4j.LoggerFactory;
// import io.swagger.v3.oas.models.media.ArraySchema;
public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(DartClientCodegen.class);
@@ -55,8 +90,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
public DartClientCodegen() {
super();
// clear import mapping (from default generator) as dart does not use it
// at the moment
// clear import mapping (from default generator) as dart does not use it at the moment
importMapping.clear();
outputFolder = "generated-code/dart";
@@ -71,19 +105,15 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
modelTestTemplateFiles.put("model_test.mustache", ".dart");
apiTestTemplateFiles.put("api_test.mustache", ".dart");
setReservedWordsLowerCase(
Arrays.asList(
"abstract", "as", "assert", "async", "async*", "await",
"break", "case", "catch", "class", "const", "continue",
"default", "deferred", "do", "dynamic", "else", "enum",
"export", "external", "extends", "factory", "false", "final",
"finally", "for", "get", "if", "implements", "import", "in",
"is", "library", "new", "null", "operator", "part", "rethrow",
"return", "set", "static", "super", "switch", "sync*", "this",
"throw", "true", "try", "typedef", "var", "void", "while",
"with", "yield", "yield*", "hide", "interface", "mixin", "on",
"show", "async")
);
List<String> reservedWordsList = new ArrayList<String>();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/main/resources/dart/dart-keywords.txt"), Charset.forName("UTF-8")));
while(reader.ready()) { reservedWordsList.add(reader.readLine()); }
reader.close();
} catch (Exception e) {
LOGGER.error("Error reading dart keywords. Exception: {}", e.getMessage());
}
setReservedWordsLowerCase(reservedWordsList);
languageSpecificPrimitives = new HashSet<String>(
Arrays.asList(

View File

@@ -0,0 +1,69 @@
abstract
as
assert
async
await
break
case
catch
class
const
continue
covariant
default
deferred
do
dynamic
else
enum
export
extends
extension
external
factory
false
final
finally
for
Function
get
hide
if
implements
import
in
inout
interface
is
late
library
mixin
native
new
null
of
on
operator
out
part
patch
required
rethrow
return
set
show
source
static
super
switch
sync
this
throw
true
try
typedef
var
void
while
with
yield

View File

@@ -17,6 +17,14 @@
package org.openapitools.codegen.dart;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.languages.DartClientCodegen;
import org.testng.Assert;
@@ -53,4 +61,26 @@ public class DartClientCodegenTest {
Assert.assertEquals(codegen.isHideGenerationTimestamp(), false);
}
@Test
public void testKeywords() throws Exception {
final DartClientCodegen codegen = new DartClientCodegen();
List<String> reservedWordsList = new ArrayList<String>();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/main/resources/dart/dart-keywords.txt"), Charset.forName("UTF-8")));
while(reader.ready()) { reservedWordsList.add(reader.readLine()); }
reader.close();
} catch (Exception e) {
String errorString = String.format(Locale.ROOT, "Error reading dart keywords: %s", e);
Assert.fail(errorString, e);
}
Assert.assertEquals(reservedWordsList.size() > 20, true);
Assert.assertEquals(codegen.reservedWords().size() == reservedWordsList.size(), true);
for(String keyword : reservedWordsList) {
// reserved words are stored in lowercase
Assert.assertEquals(codegen.reservedWords().contains(keyword.toLowerCase(Locale.ROOT)), true, String.format(Locale.ROOT, "%s, part of %s, was not found in %s", keyword, reservedWordsList, codegen.reservedWords().toString()));
}
}
}