Code review comment: It looks redundant to me. [SO answers](https://stackoverflow.com/questions/14932697/java-what-is-considered-more-readable-this-or-no-this) confirms the same. And there's no performance gain either(java compiler produces same bytecode for both). We can use `this` in ambiguous states as below(even we can simply rename the variable); ``` public MyClass(String data) {     this.data = data ``` WDYT?

Code before review:
public List<CompletionItem> resolveItems(LSServiceOperationContext ctx) {
ArrayList<CompletionItem> completionItems = new ArrayList<>();
List<String> poppedTokens = CommonUtil.popNFromStack(ctx.get(CompletionKeys.FORCE_CONSUMED_TOKENS_KEY), 3)
.stream()
.map(Token::getText)
.collect(Collectors.toList());
List<SymbolInfo> symbolInfoList = ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY);
if (isInvocationOrInteractionOrFieldAccess(ctx)) {
String delimiter = "";
String variableName = "";
for (int i = 0; i < poppedTokens.size(); i++) {
if (poppedTokens.get(i).equals(UtilSymbolKeys.DOT_SYMBOL_KEY)
|| poppedTokens.get(i).equals(UtilSymbolKeys.PKG_DELIMITER_KEYWORD)
|| poppedTokens.get(i).equals(UtilSymbolKeys.RIGHT_ARROW_SYMBOL_KEY)) {
delimiter = poppedTokens.get(i);
variableName = poppedTokens.get(i - 1);
break;
}
}
List<SymbolInfo> filteredList = FilterUtils.getInvocationAndFieldSymbolsOnVar(ctx,
variableName,
delimiter,
ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY));
filteredList.removeIf(CommonUtil.invalidSymbolsPredicate());
filteredList.forEach(symbolInfo -> {
if (CommonUtil.isValidInvokableSymbol(symbolInfo.getScopeEntry().symbol)) {
BSymbol scopeEntrySymbol = symbolInfo.getScopeEntry().symbol;
completionItems.add(this.fillInvokableSymbolMatchSnippet((BInvokableSymbol) scopeEntrySymbol, ctx));
}
});
} else {
symbolInfoList.removeIf(CommonUtil.invalidSymbolsPredicate());
symbolInfoList.forEach(symbolInfo -> {
BSymbol bSymbol = symbolInfo.getScopeEntry().symbol;
if (CommonUtil.isValidInvokableSymbol(symbolInfo.getScopeEntry().symbol)
&& ((bSymbol.flags & Flags.ATTACHED) != Flags.ATTACHED)) {
completionItems.add(this.fillInvokableSymbolMatchSnippet((BInvokableSymbol) bSymbol, ctx));
} else if (!(symbolInfo.getScopeEntry().symbol instanceof BInvokableSymbol)
&& bSymbol instanceof BVarSymbol) {
fillVarSymbolMatchSnippet((BVarSymbol) bSymbol, completionItems, ctx);
String typeName = symbolInfo.getScopeEntry().symbol.type.toString();
completionItems.add(BVariableCompletionItemBuilder.build((BVarSymbol) bSymbol,
symbolInfo.getSymbolName(), typeName));
} else if (bSymbol instanceof BPackageSymbol) {
completionItems.add(
BTypeCompletionItemBuilder.build((BPackageSymbol) bSymbol, symbolInfo.getSymbolName()));
}
});
}
ItemSorters.get(MatchContextItemSorter.class).sortItems(ctx, completionItems);
return completionItems;
}

Line under review: fillVarSymbolMatchSnippet((BVarSymbol) bSymbol, completionItems, ctx);

Code after addressing the review:
public List<CompletionItem> resolveItems(LSServiceOperationContext ctx) {
ArrayList<CompletionItem> completionItems = new ArrayList<>();
List<String> poppedTokens = CommonUtil.popNFromStack(ctx.get(CompletionKeys.FORCE_CONSUMED_TOKENS_KEY), 3)
.stream()
.map(Token::getText)
.collect(Collectors.toList());
List<SymbolInfo> symbolInfoList = ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY);
if (isInvocationOrInteractionOrFieldAccess(ctx)) {
String delimiter = "";
String variableName = "";
for (int i = 0; i < poppedTokens.size(); i++) {
if (poppedTokens.get(i).equals(UtilSymbolKeys.DOT_SYMBOL_KEY)
|| poppedTokens.get(i).equals(UtilSymbolKeys.PKG_DELIMITER_KEYWORD)
|| poppedTokens.get(i).equals(UtilSymbolKeys.RIGHT_ARROW_SYMBOL_KEY)) {
delimiter = poppedTokens.get(i);
variableName = poppedTokens.get(i - 1);
break;
}
}
List<SymbolInfo> filteredList = FilterUtils.getInvocationAndFieldSymbolsOnVar(ctx,
variableName,
delimiter,
ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY));
filteredList.removeIf(CommonUtil.invalidSymbolsPredicate());
filteredList.forEach(symbolInfo -> {
if (CommonUtil.isValidInvokableSymbol(symbolInfo.getScopeEntry().symbol)) {
BSymbol scopeEntrySymbol = symbolInfo.getScopeEntry().symbol;
completionItems.add(this.fillInvokableSymbolMatchSnippet((BInvokableSymbol) scopeEntrySymbol, ctx));
}
});
} else {
symbolInfoList.removeIf(CommonUtil.invalidSymbolsPredicate());
symbolInfoList.forEach(symbolInfo -> {
BSymbol bSymbol = symbolInfo.getScopeEntry().symbol;
if (CommonUtil.isValidInvokableSymbol(symbolInfo.getScopeEntry().symbol)
&& ((bSymbol.flags & Flags.ATTACHED) != Flags.ATTACHED)) {
completionItems.add(this.fillInvokableSymbolMatchSnippet((BInvokableSymbol) bSymbol, ctx));
} else if (!(symbolInfo.getScopeEntry().symbol instanceof BInvokableSymbol)
&& bSymbol instanceof BVarSymbol) {
fillVarSymbolMatchSnippet((BVarSymbol) bSymbol, completionItems, ctx);
String typeName = symbolInfo.getScopeEntry().symbol.type.toString();
completionItems.add(BVariableCompletionItemBuilder.build((BVarSymbol) bSymbol,
symbolInfo.getSymbolName(), typeName));
} else if (bSymbol instanceof BPackageSymbol) {
completionItems.add(
BTypeCompletionItemBuilder.build((BPackageSymbol) bSymbol, symbolInfo.getSymbolName()));
}
});
}
ItemSorters.get(MatchContextItemSorter.class).sortItems(ctx, completionItems);
return completionItems;
}