proguard.util.SingleFunctionParser Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of proguard-core Show documentation
Show all versions of proguard-core Show documentation
ProGuardCORE is a free library to read, analyze, modify, and write Java class files.
/*
* ProGuardCORE -- library to process Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package proguard.util;
/**
* This {@link StringFunctionParser} creates {@link StringFunction} instances for regular
* expressions with optional "->" transformations. It parses the first
* part with a given {@link StringParser} and the second part with an optional
* {@link WildcardManager}.
*
* @author Eric Lafortune
*/
public class SingleFunctionParser implements StringFunctionParser
{
private final StringParser stringParser;
private final WildcardManager wildcardManager;
/**
* Creates a new SingleFunctionParser.
*/
public SingleFunctionParser(StringParser stringParser,
WildcardManager wildcardManager)
{
this.stringParser = stringParser;
this.wildcardManager = wildcardManager;
}
// Implementations for StringFunctionParser.
public StringFunction parse(String regularExpression)
{
// Reset the string matchers, since all wildcards have to be local
// inside this regular expression.
if (wildcardManager != null)
{
wildcardManager.reset();
}
// Does the regular expression specify a transformation?
int arrowIndex = regularExpression.indexOf("->");
if (arrowIndex < 0)
{
// Otherwise just pass any matched strings.
return new MatchingStringFunction(stringParser.parse(regularExpression));
}
// Split the regular expression into its two parts.
String patternExpression = regularExpression.substring(0, arrowIndex);
String replacementExpression = regularExpression.substring(arrowIndex + 2);
// First parse the pattern, possibly with wildcards.
StringFunction patternStringFunction =
new MatchingStringFunction(stringParser.parse(patternExpression));
// Then parse the replacement, possibly with references to
// these wildcards.
StringFunction replacementStringFunction = wildcardManager == null ?
new ConstantStringFunction(replacementExpression) :
wildcardManager.createMatchedStringFunction(replacementExpression);
// Finally combine the two.
return new AndStringFunction(patternStringFunction,
replacementStringFunction);
}
/**
* A main method for testing name matching and replacement.
*/
public static void main(String[] args)
{
try
{
System.out.println("Regular expression ["+args[0]+"]");
WildcardManager wildcardManager = new WildcardManager();
NameParser stringParser =
new NameParser(wildcardManager);
StringFunctionParser stringFunctionParser =
new SingleFunctionParser(stringParser, wildcardManager);
StringFunction function =
stringFunctionParser.parse(args[0]);
for (int index = 1; index < args.length; index++)
{
String string = args[index];
System.out.print("String ["+string+"]");
System.out.println(" -> transformed = "+function.transform(args[index]));
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy