/* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.rf.ide.core.testdata.text.read.recognizer; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.common.annotations.VisibleForTesting; public abstract class AExecutableElementSettingsRecognizer extends ATokenRecognizer { private final static Pattern BRACKET_EXTRACTION = Pattern .compile("(?!\\[)([^\\]])+(?!\\\\])"); protected AExecutableElementSettingsRecognizer(final RobotTokenType type) { super(build(buildVariants(type)), type); } @VisibleForTesting protected static List<String> buildVariants(final RobotTokenType type) { final List<String> variants = new ArrayList<>(); final List<String> representations = type.getRepresentation(); for (final String r : representations) { final Matcher matcher = BRACKET_EXTRACTION.matcher(r); String toAdd = r; if (matcher.find()) { final int start = matcher.start(); final int end = matcher.end(); if (start == 1 && end == r.length() - 1) { toAdd = r.substring(start, end); } } variants.add(toAdd); } return variants; } @VisibleForTesting protected static Pattern build(final List<String> settingNameVariants) { final StringBuilder patternText = new StringBuilder(); final int numOfVariants = settingNameVariants.size(); if (numOfVariants > 0) { patternText.append("[ ]?("); for (int i = 0; i < numOfVariants; i++) { patternText.append("(\\[\\s*"); patternText.append(createUpperLowerCaseWord(settingNameVariants .get(i))); patternText.append("\\s*\\])"); if (i < numOfVariants - 1) { patternText.append('|'); } } patternText.append(')'); } return Pattern.compile(patternText.toString()); } }