class DescParser extends AbstractParser<DescAST> {
	@Override
	public DescAST visit(int lineNo, String line) throws ASTParseException {<FILL_FUNCTION_BODY>}

	@Override
	public List<String> suggest(ParseResult<RootAST> lastParse, String text) {
		if(text.contains("("))
			return Collections.emptyList();
		// Suggest field types
		return AutoCompleteUtil.descriptorName(text.trim());
	}

	private static boolean validate(String token) {
		// Void check
		if(token.equals("V"))
			return true;
		// Ensure type is not an array
		Type type = Type.getType(token);
		while(type.getSort() == Type.ARRAY)
			type = type.getElementType();
		// Check for primitives
		if(type.getSort() < Type.ARRAY)
			return true;
		// Verify L...; pattern
		// - getDescriptor doesn't modify the original element type (vs getInternalName)
		String desc = type.getDescriptor();
		return desc.startsWith("L") && desc.endsWith(";");
	}
}

		try {
			String trim = line.trim();
			trim = EscapeUtil.unescape(trim);
			// Verify
			if(trim.contains("(")) {
				Type type = Type.getMethodType(trim);
				if(!validate(type.getReturnType().getDescriptor()))
					throw new ASTParseException(lineNo,
							"Invalid method return type " + type.getReturnType().getDescriptor());
				for(Type arg : type.getArgumentTypes())
					if(!validate(arg.getDescriptor()))
						throw new ASTParseException(lineNo,
								"Invalid method arg type " + arg.getDescriptor());
			} else {
				if(!validate(trim))
					throw new ASTParseException(lineNo, "Invalid field descriptor: " + trim);
			}
			// Create AST
			int start = line.indexOf(trim);
			return new DescAST(lineNo, getOffset() + start, trim);
		} catch(Exception ex) {
			throw new ASTParseException(ex, lineNo, "Bad format for descriptor: " + ex.getMessage());
		}
	
<methods>public void <init>() ,public void <init>(AbstractParser#RAW) ,public int getOffset() ,public void setOffset(int) ,public List<java.lang.String> suggest(ParseResult<me.coley.recaf.parse.bytecode.ast.RootAST>, java.lang.String) ,public abstract me.coley.recaf.parse.bytecode.ast.DescAST visit(int, java.lang.String) throws me.coley.recaf.parse.bytecode.exception.ASTParseException<variables>private int offset,protected final non-sealed AbstractParser#RAW parent