class TryCatchParser extends AbstractParser<TryCatchAST> {
	private static final int TRY_LEN = "TRY ".length();

	@Override
	public TryCatchAST visit(int lineNo, String line) throws ASTParseException {<FILL_FUNCTION_BODY>}

	@Override
	public List<String> suggest(ParseResult<RootAST> lastParse, String text) {
		// Suggest exception type
		int start = text.indexOf('(') + 1;
		int end = text.indexOf(')');
		if (start > 0 && end == -1) {
			String type = text.substring(start).trim();
			return new TypeParser().suggest(lastParse, type);
		}
		// No context of last parse, can't pull names from last parsed AST
		if(lastParse == null)
			return Collections.emptyList();
		// Suggest label names
		try {
			String trim = text.trim();
			NameParser nameParser = new NameParser(this);
			String[] parts = trim.split("\\s+");
			return nameParser.suggest(lastParse, parts[parts.length - 1]);
		} catch(Exception ex) {
			return Collections.emptyList();
		}
	}
}

		try {
			// TRY start end CATCH(type) handler
			String trim = line.trim();
			int start = line.indexOf(trim);
			NameParser nameParser = new NameParser(this);
			if (!trim.contains("CATCH"))
				throw new ASTParseException(lineNo, "Missing CATCH(<type>) <handler>");
			int catchIndex = trim.indexOf("CATCH");
			String[] parts = trim.substring(0, catchIndex).split("\\s+");
			// 0 = TRY
			// 1 = start
			// 2 = end
			NameAST lblStart = nameParser.visit(lineNo, parts[1]);
			nameParser.setOffset(start + TRY_LEN);
			nameParser.setOffset(trim.indexOf(parts[2]));
			NameAST lblEnd = nameParser.visit(lineNo, parts[2]);
			// parse type
			String typeS = RegexUtil.getFirstToken("(?<=\\().+(?=\\))", trim);
			if (typeS == null)
				throw new ASTParseException(lineNo, "Missing type in CATCH(<type>)");
			typeS = typeS.trim();
			TypeAST type = null;
			if (!typeS.equals("*")) {
				TypeParser typeParser = new TypeParser();
				typeParser.setOffset(line.indexOf(typeS));
				type = typeParser.visit(lineNo, typeS.trim());
			} else {
				// Wildcard, type is null internally
				type = new TypeAST(lineNo, line.indexOf(typeS), "*") {
					@Override
					public String getType() {
						return null;
					}
				};
			}
			// handler label
			int typeEnd = trim.indexOf(')');
			nameParser.setOffset(typeEnd + 1);
			NameAST lblHandler = nameParser.visit(lineNo, trim.substring(typeEnd + 1).trim());
			return new TryCatchAST(lineNo, start, lblStart, lblEnd, type, lblHandler);
		} catch(Exception ex) {
			throw new ASTParseException(ex, lineNo, "Bad format for TRY");
		}
	
<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.TryCatchAST visit(int, java.lang.String) throws me.coley.recaf.parse.bytecode.exception.ASTParseException<variables>private int offset,protected final non-sealed AbstractParser#RAW parent