package com.linkedin.parseq.lambda; import java.util.Arrays; import java.util.Optional; class SourcePointer { final String _className; final String _callingMethod; int _lineNumber; private SourcePointer(String className, String methodName, Integer lineNumber) { _className = className; _callingMethod = methodName; _lineNumber = lineNumber; } /* package private */ static Optional<SourcePointer> get() { //create an exception, discard known elements from stack trace and find first element with suspect return Arrays.stream(new Exception().getStackTrace()) .filter(SourcePointer::notLambdaStuff) .findFirst() .map(SourcePointer::sourcePointer); } private static boolean notLambdaStuff(StackTraceElement element) { return !(element.getClassName().startsWith("java.") || element.getClassName().startsWith("sun.") || element.getClassName().startsWith("org.objectweb.asm.") || element.getClassName().startsWith(ASMBasedTaskDescriptor.class.getName()) || element.getClassName().startsWith(ASMBasedTaskDescriptor.Agent.class.getName()) || element.getClassName().startsWith(FindMethodCallAnalyzer.class.getName()) || element.getClassName().startsWith(LambdaClassLocator.class.getName()) || element.getClassName().startsWith(LambdaMethodVisitor.class.getName()) || element.getClassName().startsWith(SourcePointer.class.getName()) || element.getClassName().startsWith(SyntheticLambdaAnalyzer.class.getName()) || element.getClassName().startsWith(SyntheticLambdaAnalyzer.SyntheticLambdaMethodVisitor.class.getName()) || element.getMethodName().startsWith("lambda$") || element.getClassName().contains("$$Lambda$")); } private static SourcePointer sourcePointer(StackTraceElement stackTraceElement) { return new SourcePointer(stackTraceElement.getClassName(), stackTraceElement.getMethodName(), stackTraceElement.getLineNumber()); } public void setLineNumber(int lineNumber) { _lineNumber = lineNumber; } @Override public String toString() { return _callingMethod + "(" + Util.extractSimpleName(_className, ".") + (_lineNumber > 0 ? ":" + _lineNumber : "") + ")"; } }