@NonNull @Override Prism4j.Token clone(@NonNull Prism4j.Token token) { return clone(new ContextImpl(), token); }
@NonNull @Override Prism4j.Grammar clone(@NonNull Prism4j.Grammar grammar) { return clone(new ContextImpl(), grammar); }
@NonNull @Override Prism4j.Pattern clone(@NonNull Prism4j.Pattern pattern) { return clone(new ContextImpl(), pattern); }
@NonNull private Prism4j.Pattern clone(@NonNull Context context, @NonNull Prism4j.Pattern pattern) { Prism4j.Pattern clone = context.pattern(pattern); if (clone != null) { return clone; } final Prism4j.Grammar inside = pattern.inside(); clone = new PatternImpl( pattern.regex(), pattern.lookbehind(), pattern.greedy(), pattern.alias(), inside != null ? clone(context, inside) : null ); context.save(pattern, clone); return clone; }
@NonNull private Prism4j.Token clone(@NonNull Context context, @NonNull Prism4j.Token token) { Prism4j.Token clone = context.token(token); if (clone != null) { return clone; } final List<Prism4j.Pattern> patterns = token.patterns(); final List<Prism4j.Pattern> out = new ArrayList<>(patterns.size()); clone = new TokenImpl(token.name(), out); context.save(token, clone); for (Prism4j.Pattern pattern : patterns) { out.add(clone(context, pattern)); } return clone; }
@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; }