@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void visitMethod(ClassNode c, MethodNode m) {
		MethodEditor e = m.editor();
		
		Map<Integer, List<TryCatch>> tryCatchPositions = new HashMap<>();
		for(Object tco : new ArrayList(e.tryCatches())) {
			TryCatch tc = (TryCatch) tco;
			
			int handlerPos = e.code().indexOf(tc.handler());
			if(!tryCatchPositions.containsKey(handlerPos)) {
				List<TryCatch> handlers = new LinkedList<>();
				handlers.add(tc);
				
				tryCatchPositions.put(handlerPos, handlers);
			} else {
				tryCatchPositions.get(handlerPos).add(tc);
			}
		}
		
		for (Map.Entry<Integer, List<TryCatch>> entry : tryCatchPositions
				.entrySet()) {
			List<TryCatch> tryCatches = entry.getValue();
			if (tryCatches.size() > 1) {
				int startPos = Integer.MAX_VALUE;
				int endPos = 0;

				Label handler = tryCatches.get(0).handler();

				Set<Type> types = new HashSet<Type>();
				for(TryCatch tc : tryCatches) {
					types.add(tc.type());
				}
				
				for (TryCatch tc : tryCatches) {
					int startPos_ = e.code().indexOf(tc.start());
					if (startPos_ < startPos) {
						startPos = startPos_;
					}

					int endPos_ = e.code().indexOf(tc.end());
					if (endPos_ > endPos) {
						endPos = endPos_;
					}

					e.tryCatches().remove(tc);
				}

				for(Type type : types) {
					e.addTryCatch(new TryCatch((Label) e.codeElementAt(startPos), (Label) e.codeElementAt(endPos), handler, type));
				}
			}
		}
	}