org.ballerinalang.composer.service.workspace.langserver.util.resolvers.PackageNameContextResolver.java Source code

Java tutorial

Introduction

Here is the source code for org.ballerinalang.composer.service.workspace.langserver.util.resolvers.PackageNameContextResolver.java

Source

/*
*  Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*  WSO2 Inc. 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.
*/

package org.ballerinalang.composer.service.workspace.langserver.util.resolvers;

import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.TokenStream;
import org.ballerinalang.composer.service.workspace.langserver.SymbolInfo;
import org.ballerinalang.composer.service.workspace.langserver.dto.CompletionItem;
import org.ballerinalang.composer.service.workspace.suggetions.SuggestionsFilterDataModel;
import org.ballerinalang.natives.NativePackageProxy;
import org.ballerinalang.util.parser.BallerinaParser;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Completion Item Resolver for the Package name context
 */
class PackageNameContextResolver extends AbstractItemResolver {
    @Override
    public ArrayList<CompletionItem> resolveItems(SuggestionsFilterDataModel dataModel,
            ArrayList<SymbolInfo> symbols, HashMap<Class, AbstractItemResolver> resolvers) {
        ArrayList<CompletionItem> completionItems = new ArrayList<>();
        ArrayList<SymbolInfo> searchList = symbols;

        TokenStream tokenStream = dataModel.getTokenStream();
        int currentTokenIndex = dataModel.getTokenIndex();
        int tokenIterator = currentTokenIndex - 1;
        boolean proceed = true;

        while (proceed) {
            String tokenStr = tokenStream.get(tokenIterator).getText();
            if (tokenStr.equals(ItemResolverConstants.IMPORT) || tokenStr.equals(ItemResolverConstants.PACKAGE)) {
                proceed = false;
            } else {
                tokenIterator--;
            }
        }

        String tokenString = tokenStream.get(tokenIterator).getText();

        StringBuilder packageBuilder = new StringBuilder();
        for (int i = tokenIterator + 1; i < currentTokenIndex; i++) {
            Token token = tokenStream.get(i);
            int type = token.getType();
            if (type == BallerinaParser.WS || type == BallerinaParser.NEW_LINE) {
                continue;
            }
            packageBuilder.append(token.getText());
        }
        String packagePartial = packageBuilder.toString();
        int lastDot = packagePartial.lastIndexOf('.');
        if (lastDot >= 0) {
            packagePartial = packagePartial.substring(0, lastDot + 1);
        } else {
            packagePartial = "";
        }
        String packageTillDot = packagePartial;
        int from = packageTillDot.length();

        if (tokenString.equals(ItemResolverConstants.IMPORT)) {
            List<SymbolInfo> filteredSymbolInfoList = searchList.stream()
                    .filter(symbolInfo -> (symbolInfo.getSymbol() instanceof NativePackageProxy))
                    .collect(Collectors.toList());

            List<String> packagePrefix = filteredSymbolInfoList.stream()
                    .filter(s -> s.getSymbolName().startsWith(packageTillDot)).map(s -> firstPart(s, from))
                    .distinct().collect(Collectors.toList());

            packagePrefix.forEach((symbolInfo -> {
                // For each token call the api to get the items related to the token
                CompletionItem completionItem = new CompletionItem();
                completionItem.setLabel(symbolInfo.substring(0, symbolInfo.length() - 1));
                completionItem.setInsertText(symbolInfo);
                completionItem.setDetail(ItemResolverConstants.PACKAGE_TYPE);
                completionItem.setSortText(ItemResolverConstants.PRIORITY_4);
                completionItem.setKind(ItemResolverConstants.PACKAGE_KIND);
                completionItems.add(completionItem);
            }));
        }

        return completionItems;
    }

    private String firstPart(SymbolInfo s, int from) {
        String symbolName = s.getSymbolName();
        int dot = symbolName.indexOf('.', from);
        if (dot >= 0) {
            return symbolName.substring(from, dot) + '.';
        } else {
            return symbolName.substring(from) + ';';
        }

    }
}