/** * Factory method to create a {@link Grammar} * * @param name of the defined grammar * @param tokens a list of {@link Token}s * @return an instance of {@link Grammar} */ @NonNull public static Grammar grammar(@NonNull String name, @NonNull List<Token> tokens) { return new GrammarImpl(name, tokens); }
@NonNull public static Grammar grammar(@NonNull String name, Token... tokens) { return new GrammarImpl(name, ArrayUtils.toList(tokens)); }
@NonNull private Prism4j.Grammar clone(@NonNull Context context, @NonNull Prism4j.Grammar grammar) { Prism4j.Grammar clone = context.grammar(grammar); if (clone != null) { return clone; } final List<Prism4j.Token> tokens = grammar.tokens(); final List<Prism4j.Token> out = new ArrayList<>(tokens.size()); clone = new GrammarImpl(grammar.name(), out); context.save(grammar, clone); for (Prism4j.Token token : tokens) { out.add(clone(context, token)); } return clone; }
@NonNull public static Prism4j.Grammar extend( @NonNull Prism4j.Grammar grammar, @NonNull String name, Prism4j.Token... tokens) { // we clone the whole grammar, but override top-most tokens that are passed here final int size = tokens != null ? tokens.length : 0; if (size == 0) { return new GrammarImpl(name, clone(grammar).tokens()); } final Map<String, Prism4j.Token> overrides = new HashMap<>(size); for (Prism4j.Token token : tokens) { overrides.put(token.name(), token); } final List<Prism4j.Token> origins = grammar.tokens(); final List<Prism4j.Token> out = new ArrayList<>(origins.size()); Prism4j.Token override; for (Prism4j.Token origin : origins) { override = overrides.get(origin.name()); if (override != null) { out.add(override); } else { out.add(clone(origin)); } } return new GrammarImpl(name, out); }
return new GrammarImpl(name, out);