class TaintMethodConfigWithArgumentsAndLocation extends TaintMethodConfig {
    private static final Pattern methodWithStringConstantOrEnumPattern;
    private String location;

    static {
        String javaIdentifierRegex = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*";
        String classNameRegex = javaIdentifierRegex+"(\\/"+javaIdentifierRegex+")*";
        String methodRegex = "(("+javaIdentifierRegex+"(\\$extension)?)|(<init>))";

        // javax/servlet/http/HttpServletRequest.getAttribute("applicationConstant"):SAFE@org/apache/jsp/edit_jsp
        // javax/servlet/http/HttpServletRequest.getAttribute(UNKNOWN):SAFE@org/apache/jsp/constants_jsp
        String stringConstantRegex = "\"[^\"]*\"";
        String enumNameRegex = "[A-Z_]+";
        String methodArguments = "(" + stringConstantRegex + ",?|" + enumNameRegex + ",?)*";
        String methodWithStringConstantOrEnumRegex = classNameRegex + "\\." + methodRegex + "\\(" + methodArguments + "\\)";
        methodWithStringConstantOrEnumPattern = Pattern.compile(methodWithStringConstantOrEnumRegex);
    }

    /**
     * Constructs an empty configured summary
     */
    public TaintMethodConfigWithArgumentsAndLocation() {
        super(true);
    }

    public static boolean accepts(String typeSignature, String config) {<FILL_FUNCTION_BODY>}

    /**
     * Loads method config from String, the method config contains a current class as the context<br />
     * <br />
     * The method accepts syntax similar to {@link TaintMethodConfig#load(String)} with small difference.<br />
     * The summary must ends with '@' character followed by class name<br />
     * @param taintConfig method summary with syntax described above
     * @return initialized object with taint method summary
     * @throws IOException for bad format of parameter
     * @throws NullPointerException if argument is null
     */
    @Override
    public TaintMethodConfigWithArgumentsAndLocation load(String taintConfig) throws IOException {
        if (taintConfig == null) {
            throw new NullPointerException("String is null");
        }
        taintConfig = taintConfig.trim();
        if (taintConfig.isEmpty()) {
            throw new IOException("No taint method config specified");
        }

        int locationPos = taintConfig.lastIndexOf('@');
        if (locationPos < 0) {
            throw new IOException("Bad format: @ expected");
        }

        location = taintConfig.substring(locationPos + 1).trim();
        taintConfig = taintConfig.substring(0, locationPos);

        super.load(taintConfig);

        return this;
    }

    public String getLocation() {
        return location;
    }
}

        int pos = config.lastIndexOf('@');
        if (pos < 0) {
            return false;
        }
        config = config.substring(0, pos);

        return methodWithStringConstantOrEnumPattern.matcher(typeSignature).matches() &&
                TaintMethodConfig.configPattern.matcher(config).matches();
    
<methods>public void <init>(boolean) ,public void <init>(com.h3xstream.findsecbugs.taintanalysis.TaintMethodConfig) ,public static boolean accepts(java.lang.String, java.lang.String) ,public void addMutableStackIndex(int) ,public static com.h3xstream.findsecbugs.taintanalysis.TaintMethodConfig getDefaultConstructorConfig(int) ,public Collection<java.lang.Integer> getMutableStackIndices() ,public com.h3xstream.findsecbugs.taintanalysis.Taint getOutputTaint() ,public Map<java.lang.Integer,com.h3xstream.findsecbugs.taintanalysis.Taint> getParametersOutputTaints() ,public java.lang.String getTypeSignature() ,public boolean hasMutableStackIndices() ,public boolean isConfigured() ,public boolean isInformative() ,public boolean isParametersOutputTaintsProcessed() ,public com.h3xstream.findsecbugs.taintanalysis.TaintMethodConfig load(java.lang.String) throws java.io.IOException,public void setOuputTaint(com.h3xstream.findsecbugs.taintanalysis.Taint) ,public void setParameterOutputTaint(int, com.h3xstream.findsecbugs.taintanalysis.Taint) ,public void setParametersOutputTaintsProcessed(boolean) ,public void setTypeSignature(java.lang.String) ,public java.lang.String toString() <variables>public static final non-sealed com.h3xstream.findsecbugs.taintanalysis.TaintMethodConfig SAFE_CONFIG,protected static final non-sealed java.util.regex.Pattern configPattern,protected static final non-sealed java.util.regex.Pattern fullMethodPattern,private final non-sealed boolean isConfigured,private final non-sealed Set<java.lang.Integer> mutableStackIndices,private com.h3xstream.findsecbugs.taintanalysis.Taint outputTaint,private Map<java.lang.Integer,com.h3xstream.findsecbugs.taintanalysis.Taint> parametersOutputTaints,private boolean parametersOutputTaintsProcessed,private java.lang.String typeSignature