Java 类com.intellij.psi.PsiLambdaExpression 实例源码
项目:intellij-ce-playground
文件:LambdaMethodFilter.java
public LambdaMethodFilter(PsiLambdaExpression lambda, int expressionOrdinal, Range<Integer> callingExpressionLines) {
myLambdaOrdinal = expressionOrdinal;
myCallingExpressionLines = callingExpressionLines;
SourcePosition firstStatementPosition = null;
SourcePosition lastStatementPosition = null;
final PsiElement body = lambda.getBody();
if (body instanceof PsiCodeBlock) {
final PsiStatement[] statements = ((PsiCodeBlock)body).getStatements();
if (statements.length > 0) {
firstStatementPosition = SourcePosition.createFromElement(statements[0]);
if (firstStatementPosition != null) {
final PsiStatement lastStatement = statements[statements.length - 1];
lastStatementPosition =
SourcePosition.createFromOffset(firstStatementPosition.getFile(), lastStatement.getTextRange().getEndOffset());
}
}
}
else if (body != null) {
firstStatementPosition = SourcePosition.createFromElement(body);
}
myFirstStatementPosition = firstStatementPosition;
myLastStatementLine = lastStatementPosition != null ? lastStatementPosition.getLine() : -1;
}
项目:lombok-intellij-plugin
文件:ValProcessor.java
public void verifyVariable(@NotNull final PsiLocalVariable psiLocalVariable, @NotNull final ProblemsHolder holder) {
boolean isVal = isSameName(psiLocalVariable.getTypeElement().getText());
boolean isVar = isVar(psiLocalVariable.getTypeElement().getText());
final String ann = isVal ? "val" : "var";
if (isVal || isVar) {
final PsiExpression initializer = psiLocalVariable.getInitializer();
if (initializer == null) {
holder.registerProblem(psiLocalVariable, "'" + ann + "' on a local variable requires an initializer expression", ProblemHighlightType.ERROR);
} else if (initializer instanceof PsiArrayInitializerExpression) {
holder.registerProblem(psiLocalVariable, "'" + ann + "' is not compatible with array initializer expressions. Use the full form (new int[] { ... } instead of just { ... })", ProblemHighlightType.ERROR);
} else if (initializer instanceof PsiLambdaExpression) {
holder.registerProblem(psiLocalVariable, "'" + ann + "' is not allowed with lambda expressions.", ProblemHighlightType.ERROR);
} else if (isVal) {
final PsiElement typeParentParent = psiLocalVariable.getParent();
if (typeParentParent instanceof PsiDeclarationStatement && typeParentParent.getParent() instanceof PsiForStatement) {
holder.registerProblem(psiLocalVariable, "'" + ann + "' is not allowed in old-style for loops", ProblemHighlightType.ERROR);
}
}
}
}
项目:consulo-java
文件:LocalsControlFlowPolicy.java
@Nullable
private PsiVariable checkCodeFragment(PsiElement refElement) {
PsiElement codeFragment = ControlFlowUtil.findCodeFragment(refElement);
if (refElement instanceof PsiParameter) {
final PsiElement declarationScope = ((PsiParameter)refElement).getDeclarationScope();
if (declarationScope instanceof PsiMethod) {
codeFragment = ((PsiMethod)declarationScope).getBody();
}
else if (declarationScope instanceof PsiLambdaExpression) {
codeFragment = ((PsiLambdaExpression)declarationScope).getBody();
}
}
if (codeFragment == null) return null;
if (myCodeFragment.getContainingFile() == codeFragment.getContainingFile() && // in order for jsp includes to work
!myCodeFragment.equals(codeFragment)) {
return null;
}
return (PsiVariable)refElement;
}
项目:consulo-java
文件:PsiLambdaNameHelper.java
public static String getLambdaPrefix(@NotNull PsiLambdaExpression lambdaExpression)
{
PsiMember member = PsiTreeUtil.getParentOfType(lambdaExpression, PsiMethod.class, PsiClass.class, PsiField.class);
final String methodPrefix;
if(member instanceof PsiMethod)
{
methodPrefix = member.getContainingClass() instanceof PsiAnonymousClass ? "" : "$" + member.getName();
}
else if(member instanceof PsiField && member.getContainingClass() instanceof PsiAnonymousClass)
{
methodPrefix = "";
}
else
{
//inside class initializer everywhere or field in a named class
methodPrefix = "$new";
}
return methodPrefix;
}
项目:consulo-java
文件:DataFlowRunner.java
@NotNull
protected DfaInstructionState[] acceptInstruction(@NotNull InstructionVisitor visitor, @NotNull DfaInstructionState instructionState)
{
Instruction instruction = instructionState.getInstruction();
DfaInstructionState[] states = instruction.accept(this, instructionState.getMemoryState(), visitor);
PsiElement closure = DfaUtil.getClosureInside(instruction);
if(closure instanceof PsiClass)
{
registerNestedClosures(instructionState, (PsiClass) closure);
}
else if(closure instanceof PsiLambdaExpression)
{
registerNestedClosures(instructionState, (PsiLambdaExpression) closure);
}
return states;
}
项目:consulo-java
文件:OptionalChainInliner.java
private static void invokeAndUnwrapOptional(CFGBuilder builder, int argCount, PsiExpression function)
{
PsiLambdaExpression lambda = ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(function), PsiLambdaExpression.class);
if(lambda != null)
{
PsiParameter[] parameters = lambda.getParameterList().getParameters();
PsiExpression lambdaBody = LambdaUtil.extractSingleExpressionFromBody(lambda.getBody());
if(parameters.length == argCount && lambdaBody != null)
{
StreamEx.ofReversed(parameters).forEach(p -> builder.assignTo(p).pop());
if(pushOptionalValue(builder, lambdaBody, lambdaBody, NullabilityProblem.nullableFunctionReturn))
{
return;
}
// Restore stack for common invokeFunction
StreamEx.of(parameters).forEach(p -> builder.push(builder.getFactory().getVarFactory().createVariableValue(p, false)));
}
}
builder.evaluateFunction(function).invokeFunction(argCount, function, Nullness.NOT_NULL).pop().pushUnknown();
}
项目:consulo-java
文件:ReplaceWithTrivialLambdaFix.java
@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor)
{
PsiMethodReferenceExpression methodRef = ObjectUtils.tryCast(descriptor.getStartElement(), PsiMethodReferenceExpression.class);
if(methodRef == null)
{
return;
}
PsiLambdaExpression lambdaExpression = LambdaRefactoringUtil.convertMethodReferenceToLambda(methodRef, true, true);
if(lambdaExpression == null)
{
return;
}
PsiElement body = lambdaExpression.getBody();
if(body == null)
{
return;
}
body.replace(JavaPsiFacade.getElementFactory(project).createExpressionFromText(myValue, lambdaExpression));
}
项目:consulo-java
文件:RecursiveCallLineMarkerProvider.java
public static boolean isRecursiveMethodCall(@NotNull PsiMethodCallExpression methodCall)
{
final PsiExpression qualifier = methodCall.getMethodExpression().getQualifierExpression();
if(qualifier != null && !(qualifier instanceof PsiThisExpression))
{
return false;
}
final PsiMethod method = PsiTreeUtil.getParentOfType(methodCall, PsiMethod.class, true, PsiLambdaExpression.class, PsiClass.class);
if(method == null || !method.getName().equals(methodCall.getMethodExpression().getReferenceName()))
{
return false;
}
return Comparing.equal(method, methodCall.resolveMethod());
}
项目:consulo-java
文件:JavaLambdaTreeElement.java
@Override
public String getPresentableText()
{
if(myName != null)
{
return myName;
}
final PsiLambdaExpression element = getElement();
if(element != null)
{
myName = PsiLambdaNameHelper.getVMName(element);
return myName;
}
return "Lambda";
}
项目:consulo-java
文件:JavaLambdaTreeElement.java
@Override
public String getLocationString()
{
if(myFunctionalName == null)
{
PsiLambdaExpression lambdaExpression = getElement();
if(lambdaExpression != null)
{
final PsiType interfaceType = lambdaExpression.getFunctionalInterfaceType();
if(interfaceType != null)
{
myFunctionalName = interfaceType.getPresentableText();
}
}
}
return myFunctionalName;
}
项目:consulo-java
文件:PsiMethodListPopupStep.java
@Override
@NotNull
public String getTextFor(SmartStepTarget value)
{
final String label = value.getLabel();
final String formatted;
if(value instanceof MethodSmartStepTarget)
{
final PsiMethod method = ((MethodSmartStepTarget) value).getMethod();
formatted = PsiFormatUtil.formatMethod(method, PsiSubstitutor.EMPTY, PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_PARAMETERS,
PsiFormatUtil.SHOW_TYPE, 999);
}
else if(value instanceof LambdaSmartStepTarget)
{
final PsiLambdaExpression lambda = ((LambdaSmartStepTarget) value).getLambda();
formatted = PsiFormatUtil.formatType(lambda.getType(), 0, PsiSubstitutor.EMPTY);
}
else
{
formatted = "";
}
return label != null ? label + formatted : formatted;
}
项目:consulo-java
文件:JavaLineBreakpointType.java
@Nullable
public PsiElement getContainingMethod(@NotNull LineBreakpoint<?> breakpoint)
{
SourcePosition position = breakpoint.getSourcePosition();
if(position == null)
{
return null;
}
JavaBreakpointProperties properties = breakpoint.getProperties();
if(properties instanceof JavaLineBreakpointProperties && !(breakpoint instanceof RunToCursorBreakpoint))
{
Integer ordinal = ((JavaLineBreakpointProperties) properties).getLambdaOrdinal();
if(ordinal > -1)
{
List<PsiLambdaExpression> lambdas = DebuggerUtilsEx.collectLambdas(position, true);
if(ordinal < lambdas.size())
{
return lambdas.get(ordinal);
}
}
}
return DebuggerUtilsEx.getContainingMethod(position);
}
项目:thinr
文件:ThinrDetector.java
@Override
public List<Class<? extends PsiElement>> getApplicablePsiTypes() {
List<Class<? extends PsiElement>> res = new ArrayList<>();
res.add(PsiLambdaExpression.class);
return res;
//return Collections.singletonList(PsiLambdaExpression.class);
}
项目:thinr
文件:ThinrDetector.java
@Override
public JavaElementVisitor createPsiVisitor(@NonNull final JavaContext context) {
return new JavaElementVisitor() {
@Override
public void visitLambdaExpression(PsiLambdaExpression expression) {
if (!(expression.getParent() instanceof PsiExpressionList)) {
return;
}
PsiExpressionList exprList = (PsiExpressionList) expression.getParent();
if (!(exprList.getParent() instanceof PsiMethodCallExpression)) {
return;
}
PsiMethodCallExpression call = (PsiMethodCallExpression) exprList.getParent();
if (call.getType() == null) {
return;
}
String callType = call.getType().getCanonicalText();
if (!callType.startsWith("de.mobilej.thinr.Thinr")) {
return;
}
markLeakSuspects(expression, expression, context);
}
};
}
项目:intellij-ce-playground
文件:JavaSourcePositionHighlighter.java
@Override
public TextRange getHighlightRange(SourcePosition sourcePosition) {
PsiElement method = DebuggerUtilsEx.getContainingMethod(sourcePosition);
if (method instanceof PsiLambdaExpression) {
return method.getTextRange();
}
return null;
}
项目:consulo-java
文件:DataFlowRunner.java
@Nullable
private Collection<DfaMemoryState> createInitialStates(@NotNull PsiElement psiBlock, @NotNull InstructionVisitor visitor)
{
PsiElement container = PsiTreeUtil.getParentOfType(psiBlock, PsiClass.class, PsiLambdaExpression.class);
if(container != null && (!(container instanceof PsiClass) || PsiUtil.isLocalOrAnonymousClass((PsiClass) container)))
{
PsiElement block = DfaPsiUtil.getTopmostBlockInSameClass(container.getParent());
if(block != null)
{
final RunnerResult result;
try
{
myInlining = false;
result = analyzeMethod(block, visitor);
}
finally
{
myInlining = true;
}
if(result == RunnerResult.OK)
{
final Collection<DfaMemoryState> closureStates = myNestedClosures.get(DfaPsiUtil.getTopmostBlockInSameClass(psiBlock));
if(!closureStates.isEmpty())
{
return closureStates;
}
}
return null;
}
}
return Collections.singletonList(createMemoryState());
}
项目:consulo-java
文件:DataFlowRunner.java
private void registerNestedClosures(@NotNull DfaInstructionState instructionState, @NotNull PsiLambdaExpression expr)
{
DfaMemoryState state = instructionState.getMemoryState();
PsiElement body = expr.getBody();
if(body != null)
{
createClosureState(body, state);
}
}
项目:consulo-java
文件:LambdaInliner.java
@Override
public boolean tryInlineCall(@NotNull CFGBuilder builder, @NotNull PsiMethodCallExpression call)
{
PsiMethod method = call.resolveMethod();
if(method == null || method != LambdaUtil.getFunctionalInterfaceMethod(method.getContainingClass()))
{
return false;
}
PsiTypeCastExpression typeCastExpression = ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(call.getMethodExpression().getQualifierExpression()), PsiTypeCastExpression.class);
if(typeCastExpression == null)
{
return false;
}
PsiLambdaExpression lambda = ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(typeCastExpression.getOperand()), PsiLambdaExpression.class);
if(lambda == null || lambda.getBody() == null)
{
return false;
}
if(method.isVarArgs())
{
return false; // TODO: support varargs
}
PsiExpression[] args = call.getArgumentList().getExpressions();
PsiParameter[] parameters = lambda.getParameterList().getParameters();
if(args.length != parameters.length)
{
return false;
}
EntryStream.zip(args, parameters).forKeyValue((arg, parameter) -> builder.pushVariable(parameter).pushExpression(arg).boxUnbox(arg, parameter.getType()).assign().pop());
builder.inlineLambda(lambda, Nullness.UNKNOWN);
return true;
}
项目:consulo-java
文件:JavaLambdaNodeProvider.java
@NotNull
@Override
public List<JavaLambdaTreeElement> provideNodes(@NotNull TreeElement node)
{
if(node instanceof PsiMethodTreeElement ||
node instanceof PsiFieldTreeElement ||
node instanceof ClassInitializerTreeElement ||
node instanceof JavaLambdaTreeElement)
{
final PsiElement el = ((PsiTreeElementBase) node).getElement();
if(el != null)
{
final List<JavaLambdaTreeElement> result = new ArrayList<>();
el.accept(new JavaRecursiveElementVisitor()
{
@Override
public void visitLambdaExpression(PsiLambdaExpression expression)
{
super.visitLambdaExpression(expression);
result.add(new JavaLambdaTreeElement(expression));
}
@Override
public void visitClass(PsiClass aClass)
{
//stop at class level
}
});
return result;
}
}
return Collections.emptyList();
}
项目:consulo-java
文件:JavaFileTreeModel.java
@Override
@NotNull
protected Class[] getSuitableClasses()
{
return new Class[]{
PsiClass.class,
PsiMethod.class,
PsiField.class,
PsiLambdaExpression.class,
PsiJavaFile.class
};
}
项目:consulo-java
文件:LambdaMethodFilter.java
public LambdaMethodFilter(PsiLambdaExpression lambda, int expressionOrdinal, Range<Integer> callingExpressionLines)
{
myLambdaOrdinal = expressionOrdinal;
myCallingExpressionLines = callingExpressionLines;
SourcePosition firstStatementPosition = null;
SourcePosition lastStatementPosition = null;
final PsiElement body = lambda.getBody();
if(body instanceof PsiCodeBlock)
{
final PsiStatement[] statements = ((PsiCodeBlock) body).getStatements();
if(statements.length > 0)
{
firstStatementPosition = SourcePosition.createFromElement(statements[0]);
if(firstStatementPosition != null)
{
final PsiStatement lastStatement = statements[statements.length - 1];
lastStatementPosition = SourcePosition.createFromOffset(firstStatementPosition.getFile(),
lastStatement.getTextRange().getEndOffset());
}
}
}
else if(body != null)
{
firstStatementPosition = SourcePosition.createFromElement(body);
}
myFirstStatementPosition = firstStatementPosition;
myLastStatementLine = lastStatementPosition != null ? lastStatementPosition.getLine() : -1;
}
项目:consulo-java
文件:JavaSourcePositionHighlighter.java
@Override
public TextRange getHighlightRange(SourcePosition sourcePosition)
{
PsiElement method = DebuggerUtilsEx.getContainingMethod(sourcePosition);
if(method instanceof PsiLambdaExpression)
{
return method.getTextRange();
}
return null;
}
项目:consulo-java
文件:LambdaSmartStepTarget.java
public LambdaSmartStepTarget(
@NotNull PsiLambdaExpression lambda,
@Nullable String label,
@Nullable PsiElement highlightElement,
int ordinal,
Range<Integer> lines)
{
super(label, highlightElement, true, lines);
myLambda = lambda;
myOrdinal = ordinal;
}
项目:Android_Lint_SRP_Practice_Example
文件:PsiClassStructureDetector.java
@Override
public void visitLambdaExpression(PsiLambdaExpression expression) {
mVisitor.report("PsiLambdaExpression", expression.getText(), expression);
super.visitExpression(expression);
}
项目:intellij-ce-playground
文件:LambdaSmartStepTarget.java
public LambdaSmartStepTarget(@NotNull PsiLambdaExpression lambda, @Nullable String label, @Nullable PsiElement highlightElement, int ordinal, Range<Integer> lines) {
super(label, highlightElement, true, lines);
myLambda = lambda;
myOrdinal = ordinal;
}
项目:intellij-ce-playground
文件:LambdaSmartStepTarget.java
public PsiLambdaExpression getLambda() {
return myLambda;
}
项目:intellij-ce-playground
文件:LambdaInstruction.java
public LambdaInstruction(PsiLambdaExpression lambdaExpression) {
myLambdaExpression = lambdaExpression;
}
项目:intellij-ce-playground
文件:LambdaInstruction.java
public PsiLambdaExpression getLambdaExpression() {
return myLambdaExpression;
}
项目:intellij-ce-playground
文件:AssignmentToLambdaParameterInspection.java
@Override
protected boolean isCorrectScope(PsiElement declarationScope) {
return declarationScope instanceof PsiLambdaExpression;
}
项目:intellij-ce-playground
文件:NestedSynchronizedStatementInspection.java
public static <T extends PsiStatement> boolean isNestedStatement(@NotNull T statement, @NotNull Class<T> aClass) {
return PsiTreeUtil.getParentOfType(statement, aClass, true, PsiClass.class, PsiLambdaExpression.class) != null;
}
项目:consulo-java
文件:LambdaExpressionElementType.java
@Override
public PsiLambdaExpression createPsi(@NotNull ASTNode node)
{
return new PsiLambdaExpressionImpl(node);
}
项目:consulo-java
文件:LambdaExpressionElementType.java
@Override
public PsiLambdaExpression createPsi(@NotNull FunctionalExpressionStub<PsiLambdaExpression> stub)
{
return new PsiLambdaExpressionImpl(stub);
}
项目:consulo-java
文件:LambdaInstruction.java
public LambdaInstruction(PsiLambdaExpression lambdaExpression)
{
myLambdaExpression = lambdaExpression;
}
项目:consulo-java
文件:LambdaInstruction.java
public PsiLambdaExpression getLambdaExpression()
{
return myLambdaExpression;
}
项目:consulo-java
文件:JavaCodeBlockModificationListener.java
private static boolean hasClassesInside(@Nullable PsiElement element)
{
return !SyntaxTraverser.psiTraverser(element).traverse().filter(Conditions.instanceOf(PsiClass.class, PsiLambdaExpression.class)).isEmpty();
}
项目:consulo-java
文件:JavaLambdaTreeElement.java
public JavaLambdaTreeElement(PsiLambdaExpression lambdaExpression)
{
super(false, lambdaExpression);
}
项目:consulo-java
文件:RemoveUnnecessaryParenthesesIntention.java
public static void stripLambdaParameterParentheses(PsiParameterList element) {
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(element.getProject());
final String text = element.getParameters()[0].getName() + "->{}";
final PsiLambdaExpression expression = (PsiLambdaExpression)factory.createExpressionFromText(text, element);
element.replace(expression.getParameterList());
}
项目:consulo-java
文件:BasicStepMethodFilter.java
public boolean locationMatches(DebugProcessImpl process, Location location, @NotNull EvaluatingComputable<ObjectReference> thisProvider) throws EvaluateException
{
Method method = location.method();
String name = method.name();
if(!myTargetMethodName.equals(name))
{
if(DebuggerUtilsEx.isLambdaName(name))
{
SourcePosition position = process.getPositionManager().getSourcePosition(location);
return ReadAction.compute(() ->
{
PsiElement psiMethod = DebuggerUtilsEx.getContainingMethod(position);
if(psiMethod instanceof PsiLambdaExpression)
{
PsiType type = ((PsiLambdaExpression) psiMethod).getFunctionalInterfaceType();
PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(type);
if(type != null && interfaceMethod != null && myTargetMethodName.equals(interfaceMethod.getName()))
{
try
{
return InheritanceUtil.isInheritor(type, myDeclaringClassName.getName(process).replace('$', '.'));
}
catch(EvaluateException e)
{
LOG.info(e);
}
}
}
return false;
});
}
return false;
}
if(myTargetMethodSignature != null && !signatureMatches(method, myTargetMethodSignature.getName(process)))
{
return false;
}
if(method.isBridge())
{ // skip bridge methods
return false;
}
String declaringClassNameName = myDeclaringClassName.getName(process);
boolean res = DebuggerUtilsEx.isAssignableFrom(declaringClassNameName, location.declaringType());
if(!res && !method.isStatic())
{
ObjectReference thisObject = thisProvider.compute();
if(thisObject != null)
{
res = DebuggerUtilsEx.isAssignableFrom(declaringClassNameName, thisObject.referenceType());
}
}
return res;
}
项目:consulo-java
文件:LambdaSmartStepTarget.java
public PsiLambdaExpression getLambda()
{
return myLambda;
}
项目:consulo-java
文件:JavaLineBreakpointType.java
@NotNull
@Override
public List<JavaBreakpointVariant> computeVariants(@NotNull Project project, @NotNull XSourcePosition position)
{
SourcePosition pos = DebuggerUtilsEx.toSourcePosition(position, project);
if(pos == null)
{
return Collections.emptyList();
}
List<PsiLambdaExpression> lambdas = DebuggerUtilsEx.collectLambdas(pos, true);
if(lambdas.isEmpty())
{
return Collections.emptyList();
}
PsiElement startMethod = DebuggerUtilsEx.getContainingMethod(pos);
//noinspection SuspiciousMethodCalls
if(lambdas.contains(startMethod) && lambdas.size() == 1)
{
return Collections.emptyList();
}
Document document = PsiDocumentManager.getInstance(project).getDocument(pos.getFile());
if(document == null)
{
return Collections.emptyList();
}
List<JavaBreakpointVariant> res = new SmartList<>();
if(!(startMethod instanceof PsiLambdaExpression))
{
res.add(new LineJavaBreakpointVariant(position, startMethod, -1)); // base method
}
int ordinal = 0;
for(PsiLambdaExpression lambda : lambdas) //lambdas
{
PsiElement firstElem = DebuggerUtilsEx.getFirstElementOnTheLine(lambda, document, position.getLine());
XSourcePositionImpl elementPosition = XSourcePositionImpl.createByElement(firstElem);
if(elementPosition != null)
{
if(lambda == startMethod)
{
res.add(0, new LineJavaBreakpointVariant(elementPosition, lambda, ordinal++));
}
else
{
res.add(new LambdaJavaBreakpointVariant(elementPosition, lambda, ordinal++));
}
}
}
res.add(new JavaBreakpointVariant(position)); //all
return res;
}