private void resolveSampleParamConfigs( InitCodeContext context, Map<String, SampleParameterConfig> configs) { for (Map.Entry<String, SampleParameterConfig> entry : configs.entrySet()) { Scanner scanner = new Scanner(entry.getKey()); InitCodeNode parent = FieldStructureParser.parsePath(this, scanner); int token = scanner.lastToken(); if (token == Scanner.EOF) { parent.resolveSampleParamConfig(context, entry.getValue()); } else if (token == '%') { Preconditions.checkArgument( scanner.scan() == Scanner.IDENT, "expected IDENT after '%': %s", entry.getKey()); String entityName = scanner.tokenStr(); Preconditions.checkArgument( scanner.scan() == Scanner.EOF, "expected EOF after entity name: %s", entityName); parent.resolveSampleParamConfig(context, entityName, entry.getValue()); } } }
if (digit(codePoint)) { int start = loc; loc += Character.charCount(codePoint); if (!digit(codePoint)) { break; if (identLead(codePoint) || codePoint == '$') { boolean valid = identLead(codePoint); int start = loc; loc += Character.charCount(codePoint); if (valid && !identFollow(codePoint)) { tokenStr = input.substring(start, loc); return last = IDENT; valid || identLead(codePoint), "identifier needs a letter or underscore after '$': %s", input);
/** * Parses the value of configs (i.e. the RHS of the '='). If the value is a double-quoted string * literal we return it unquoted. Otherwise we strip leading spaces and return the rest of value * as a string for backward compatibility. */ private static String parseValue(Scanner scanner) { int token = scanner.scan(); // Scanner.STRING means a double-quoted string literal if (token == Scanner.STRING) { String tokenStr = scanner.tokenStr(); if (scanner.scan() == Scanner.EOF) { return tokenStr; } } return scanner.tokenStr() + scanner.input().substring(scanner.pos()); } }
Scanner scanner = new Scanner(path); Preconditions.checkArgument( scanner.scan() == Scanner.IDENT, "expected identifier: %s", scanner.input()); int token; String entityName = null; while (true) { token = scanner.scan(); switch (token) { case '%': entityName == null, "expected only one \"%%\" in path: %s", path); Preconditions.checkArgument( scanner.scan() == Scanner.IDENT, "expected identifier after '%%': %s", scanner.input()); entityName = scanner.tokenStr(); break; case '=': case '.': Preconditions.checkArgument( scanner.scan() == Scanner.IDENT, "expected identifier after '.': %s", scanner.input()); break; case '[': Preconditions.checkArgument( scanner.scan() == Scanner.INT, "expected number after '[': %s", scanner.input()); Preconditions.checkArgument(
@Test public void testScannerInt() { { Scanner scanner = new Scanner("123 456"); assertThat(scanner.scan()).isEqualTo(Scanner.INT); assertThat(scanner.tokenStr()).isEqualTo("123"); assertThat(scanner.scan()).isEqualTo(Scanner.INT); assertThat(scanner.tokenStr()).isEqualTo("456"); assertThat(scanner.scan()).isEqualTo(Scanner.EOF); } // Leading zero not allowed. assertThrow(() -> new Scanner("0123").scan()); // Just zero is OK though. { Scanner scanner = new Scanner("0"); assertThat(scanner.scan()).isEqualTo(Scanner.INT); assertThat(scanner.tokenStr()).isEqualTo("0"); assertThat(scanner.scan()).isEqualTo(Scanner.EOF); } }
public InitCodeNode subTree(String config) { return FieldStructureParser.parsePath(this, new Scanner(config)); }
private static boolean identFollow(int codePoint) { return identLead(codePoint) || Character.isDigit(codePoint); } }
@Test public void testScanner() { Scanner scanner = new Scanner("$abc = def123 + 456 + \"xyz\";"); assertThat(scanner.scan()).isEqualTo(Scanner.IDENT); assertThat(scanner.tokenStr()).isEqualTo("$abc"); assertThat(scanner.scan()).isEqualTo('='); assertThat(scanner.scan()).isEqualTo(Scanner.IDENT); assertThat(scanner.tokenStr()).isEqualTo("def123"); assertThat(scanner.scan()).isEqualTo('+'); assertThat(scanner.scan()).isEqualTo(Scanner.INT); assertThat(scanner.tokenStr()).isEqualTo("456"); assertThat(scanner.scan()).isEqualTo('+'); assertThat(scanner.scan()).isEqualTo(Scanner.STRING); assertThat(scanner.tokenStr()).isEqualTo("xyz"); assertThat(scanner.scan()).isEqualTo(';'); assertThat(scanner.scan()).isEqualTo(Scanner.EOF); }
private OutputView.PrintView printView( List<String> config, MethodContext context, SampleValueSet valueSet, ScopeTable localVars) { Preconditions.checkArgument( !config.isEmpty(), "%s:%s: print spec cannot be empty", context.getMethodModel().getSimpleName(), valueSet.getId()); return OutputView.PrintView.newBuilder() .format(context.getNamer().getPrintSpec(config.get(0))) .args( config .subList(1, config.size()) .stream() .map( a -> printArgTransformer.generatePrintArg( context, accessor(new Scanner(a), context, valueSet, localVars))) .collect(ImmutableList.toImmutableList())) .build(); }
/** * Returns all the nodes to be rendered as sample function parameters. * * <p>If path is: * <li>a normal node, returns that node. * <li>a ReadFile node, returns the child node of that node. * <li>a resource path, returns the child node whose key equals the entity name in the path. */ private List<InitCodeNode> sampleFuncParams(InitCodeNode root, List<String> paths) { List<InitCodeNode> params = new ArrayList<>(); for (String path : paths) { Scanner scanner = new Scanner(path); InitCodeNode node = FieldStructureParser.parsePath(root, scanner); int token = scanner.lastToken(); if (token == '%') { scanner.scan(); params.add(node.getChildren().get(scanner.tokenStr())); } else if (node.getLineType() == InitCodeLineType.ReadFileInitLine) { params.add(node.getChildren().get(InitCodeNode.FILE_NAME_KEY)); } else { params.add(node); } } return params; }
@Test public void testScannerDollar() { assertThrow(() -> new Scanner("$$abc").scan()); { Scanner scanner = new Scanner("$a$b$"); assertThat(scanner.scan()).isEqualTo(Scanner.IDENT); assertThat(scanner.tokenStr()).isEqualTo("$a"); assertThat(scanner.scan()).isEqualTo(Scanner.IDENT); assertThat(scanner.tokenStr()).isEqualTo("$b"); assertThrow(() -> scanner.scan()); } { Scanner scanner = new Scanner("a$$b"); assertThat(scanner.scan()).isEqualTo(Scanner.IDENT); assertThat(scanner.tokenStr()).isEqualTo("a"); assertThrow(() -> scanner.scan()); } { Scanner scanner = new Scanner("a$"); assertThat(scanner.scan()).isEqualTo(Scanner.IDENT); assertThat(scanner.tokenStr()).isEqualTo("a"); assertThrow(() -> scanner.scan()); } }
scanner.scan() == Scanner.IDENT, "expected identifier: %s", scanner.input()); InitCodeNode parent = root.mergeChild(InitCodeNode.create(scanner.tokenStr())); int token; token = scanner.scan(); switch (token) { case '%': case '.': Preconditions.checkArgument( scanner.scan() == Scanner.IDENT, "expected identifier after '.': %s", scanner.input()); parent.setLineType(InitCodeLineType.StructureInitLine); parent = parent.mergeChild(InitCodeNode.create(scanner.tokenStr())); break; scanner.scan() == Scanner.INT, "expected number after '[': %s", scanner.input()); parent.setLineType(InitCodeLineType.ListInitLine); parent = parent.mergeChild(InitCodeNode.create(scanner.tokenStr())); scanner.scan() == ']', "expected closing ']': %s", scanner.input()); break; scanner.scan() == '}', "expected closing '}': %s", scanner.input()); break; String.format("unexpected character '%c': %s", token, scanner.input()));
view = defineView(new Scanner(config.getDefine()), context, valueSet, localVars);
private static InitCodeNode parseConfig( InitCodeNode root, String config, Map<String, InitValueConfig> initValueConfigMap) { Scanner scanner = new Scanner(config); int token = scanner.lastToken(); fieldNamePos = scanner.pos() - 1; Preconditions.checkArgument( scanner.scan() == Scanner.IDENT, "expected ident after '%': %s", config); entityName = scanner.tokenStr(); token = scanner.scan();
private OutputView.DefineView defineView( Scanner definition, MethodContext context, SampleValueSet valueSet, ScopeTable localVars) { Preconditions.checkArgument( definition.scan() == Scanner.IDENT, "%s:%s: expected identifier: %s", context.getMethodModel().getSimpleName(), valueSet.getId(), definition.input()); String identifier = definition.tokenStr(); assertIdentifierNotReserved( identifier, context.getMethodModel().getSimpleName(), valueSet.getId()); Preconditions.checkArgument( definition.scan() == '=', "%s:%s invalid definition, expecting '=': %s", context.getMethodModel().getSimpleName(), valueSet.getId(), definition.input()); OutputView.VariableView reference = accessorNewVariable(definition, context, valueSet, localVars, identifier, false); return OutputView.DefineView.newBuilder() .variableType(localVars.getTypeName(identifier)) .variableName(context.getNamer().localVarName(Name.from(identifier))) .reference(reference) .build(); }
@Test public void testAccessorNewVariableScalarTypeForCollectionFail() { TypeModel oldVarTypeModel = mock(TypeModel.class); assertThat(parent.put("old_var", oldVarTypeModel, "OldVarTypeName")).isTrue(); Scanner scanner = new Scanner("old_var"); when(oldVarTypeModel.isRepeated()).thenReturn(false); when(namer.localVarName(Name.from("old_var"))).thenReturn("oldVar"); when(namer.getAndSaveTypeName(typeTable, oldVarTypeModel)).thenReturn("OldVarTypeName"); try { OutputView.VariableView variableView = accessorNewVariable(scanner, context, valueSet, parent, "newVar", true); fail(); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("is not a repeated field"); } }
config.scan() == Scanner.IDENT, "%s:%s: expected identifier: %s", context.getMethodModel().getSimpleName(), valueSet.getId(), config.input()); String baseIdentifier = config.tokenStr(); while ((token = config.scan()) != Scanner.EOF) { if (token == '.') { context.getMethodModel().getSimpleName(), valueSet.getId(), config.input()); Preconditions.checkArgument( !type.isRepeated() && !type.isMap(), context.getMethodModel().getSimpleName(), valueSet.getId(), config.input()); config.scan() == Scanner.IDENT, "%s:%s: expected identifier: %s", context.getMethodModel().getSimpleName(), valueSet.getId(), config.input()); String fieldName = config.tokenStr(); FieldModel field = Preconditions.checkNotNull(
@Test public void testAccessorNewVariableResponse() { Scanner scanner = new Scanner("$resp"); when(config.getPageStreaming()).thenReturn(null); TypeModel typeModel = mock(TypeModel.class); when(namer.getAndSaveTypeName(typeTable, typeModel)).thenReturn("TypeName"); when(model.getOutputType()).thenReturn(typeModel); OutputView.VariableView variableView = accessorNewVariable(scanner, context, valueSet, parent, "newVar", false); assertThat(variableView.variable()).isEqualTo("sampleResponseVarName"); assertThat(variableView.accessors()).isEmpty(); assertThat(parent.getTypeName("newVar")).isEqualTo("TypeName"); assertThat(parent.getTypeModel("newVar")).isEqualTo(typeModel); }
@Test public void testAccessorNewVariablePageStreamingResourceNameResponse() { Scanner scanner = new Scanner("$resp"); when(config.getPageStreaming()).thenReturn(pageStreamingConfig); when(pageStreamingConfig.getResourcesFieldConfig()).thenReturn(resourceFieldConfig); when(namer.getAndSaveElementResourceTypeName(typeTable, resourceFieldConfig)) .thenReturn("ShelfBookName"); when(featureConfig.useResourceNameFormatOption(resourceFieldConfig)).thenReturn(true); OutputView.VariableView variableView = accessorNewVariable(scanner, context, valueSet, parent, "newVar", false); assertThat(variableView.variable()).isEqualTo("sampleResponseVarName"); assertThat(variableView.accessors()).isEmpty(); assertThat(parent.getTypeName("newVar")).isEqualTo("ShelfBookName"); assertThat(parent.getTypeModel("newVar")).isNull(); }