| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| import com.intellij.codeInsight.completion.*; |
| |
| import com.intellij.patterns.PatternCondition; |
| import com.intellij.patterns.PsiJavaElementPattern; |
| import com.intellij.patterns.PsiJavaPatterns; |
| import static com.intellij.patterns.PlatformPatterns.psiElement; |
| |
| import com.intellij.psi.*; |
| |
| import com.intellij.codeInsight.lookup.LookupElementBuilder; |
| import com.intellij.util.ProcessingContext; |
| import org.jetbrains.annotations.NotNull; |
| |
| /** |
| * The `BeamCompletionContributor` class is a subclass of `CompletionContributor` that provides code completion |
| * suggestions specifically for Apache Beam pipelines. |
| */ |
| public class BeamCompletionContributor extends CompletionContributor { |
| public static final String[] beamJavaSDKTransforms = { |
| "Filter", "FlatMapElements", "Keys", "KvSwap", "MapElements", "ParDo", |
| "Partition", "Regex", "Reify", "ToString", "WithKeys", "WithTimestamps", |
| "Values", "ApproximateQuantiles", "ApproximateUnique", "CoGroupByKey", "Combine", |
| "CombineWithContext", "Count", "Distinct", "GroupByKey", "GroupIntoBatches", |
| "HllCount", "Latest", "Max", "Mean", "Min", "Sample", "Sum", "Top", |
| "Create", "Flatten", "PAssert", "View", "Window" |
| }; |
| |
| /** |
| * A pattern condition that matches method call expressions with the name "apply" in the context of the |
| * Apache Beam `Pipeline` class. |
| */ |
| public static final PatternCondition<PsiMethodCallExpression> APPLY_METHOD_PATTERN = new PatternCondition<>("") { |
| @Override |
| public boolean accepts(@NotNull PsiMethodCallExpression psiMethodCallExpression, ProcessingContext context) { |
| String referenceName = psiMethodCallExpression.getMethodExpression().getReferenceName(); |
| if (referenceName != null){ |
| if (!referenceName.equals("apply")) { |
| return false; |
| } |
| PsiMethod resolvedMethod = psiMethodCallExpression.resolveMethod(); |
| if (resolvedMethod != null){ |
| PsiClass containingClass = resolvedMethod.getContainingClass(); |
| if (containingClass != null){ |
| return "org.apache.beam.sdk.Pipeline".equals(containingClass.getQualifiedName()) || |
| "org.apache.beam.sdk.values.PCollection".equals(containingClass.getQualifiedName()); |
| } |
| } |
| } |
| return false; |
| } |
| }; |
| |
| /** |
| * A pattern that matches an identifier after a method call expression that satisfies the `APPLY_METHOD_PATTERN`. |
| */ |
| private static final PsiJavaElementPattern.Capture<PsiIdentifier> AFTER_METHOD_CALL_PATTERN = |
| PsiJavaPatterns.psiElement(PsiIdentifier.class) |
| .withParent( |
| psiElement(PsiReferenceExpression.class) |
| .withParent( |
| psiElement(PsiExpressionList.class) |
| .withParent( |
| psiElement(PsiMethodCallExpression.class) |
| .with(APPLY_METHOD_PATTERN) |
| ) |
| ) |
| ); |
| |
| /** |
| * Fills the completion variants with Transforms from Java SDK. |
| */ |
| @Override |
| public void fillCompletionVariants(@NotNull final CompletionParameters parameters, @NotNull CompletionResultSet result) { |
| if (AFTER_METHOD_CALL_PATTERN.accepts(parameters.getPosition())){ |
| for (String transform: beamJavaSDKTransforms) { |
| result.addElement(LookupElementBuilder.create(transform).appendTailText(" org.apache.beam.sdk.transforms", true)); |
| } |
| } |
| } |
| } |