Search in sources :

Example 26 with GlobalReference

use of nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference in project magik-tools by StevenLooman.

the class MagikIndexer method handleDefinition.

private void handleDefinition(final MagikFile magikFile, final MethodDefinition definition) {
    final AstNode node = definition.getNode();
    if (node.isNot(MagikGrammar.METHOD_DEFINITION)) {
        // No slot accessors, shared variables, shared constants.
        this.handleMethodDefinitionOther(magikFile, definition);
        return;
    }
    // Get exemplar.
    final GlobalReference globalRef = definition.getTypeGlobalReference();
    final AbstractType exemplarType = this.typeKeeper.getType(globalRef);
    if (exemplarType == UndefinedType.INSTANCE) {
        LOGGER.warn("Unknown type: {}", globalRef);
        return;
    }
    // Combine parameter types with method docs.
    final NewDocParser newDocParser = new NewDocParser(node);
    final Map<String, String> parameterTypes = newDocParser.getParameterTypes();
    final List<Parameter> parameters = definition.getParameters().stream().map(parameterDefinition -> {
        final String name = parameterDefinition.getName();
        final AbstractType type;
        if (!parameterTypes.containsKey(name)) {
            type = UndefinedType.INSTANCE;
        } else {
            final String parameterType = parameterTypes.get(name);
            type = this.typeParser.parseTypeString(parameterType, globalRef.getPakkage());
        }
        final Parameter.Modifier modifier = MagikIndexer.PARAMETER_MODIFIER_MAPPING.get(parameterDefinition.getModifier());
        return new Parameter(name, modifier, type);
    }).collect(Collectors.toList());
    final ParameterDefinition assignParamDef = definition.getAssignmentParameter();
    final Parameter assignmentParameter = assignParamDef != null ? new Parameter(assignParamDef.getName(), MagikIndexer.PARAMETER_MODIFIER_MAPPING.get(assignParamDef.getModifier())) : null;
    // Combine iterator types with method docs.
    final ExpressionResult loopResult = newDocParser.getLoopTypes().stream().map(type -> this.typeParser.parseTypeString(type, globalRef.getPakkage())).collect(ExpressionResult.COLLECTOR);
    // Combine return types with method docs.
    final ExpressionResult callResult = newDocParser.getReturnTypes().stream().map(type -> this.typeParser.parseTypeString(type, globalRef.getPakkage())).collect(ExpressionResult.COLLECTOR);
    // Create method.
    final MagikType magikType = (MagikType) exemplarType;
    final EnumSet<Method.Modifier> modifiers = definition.getModifiers().stream().map(modifier -> MagikIndexer.METHOD_MODIFIER_MAPPING.get(modifier)).collect(Collectors.toCollection(() -> EnumSet.noneOf(Method.Modifier.class)));
    final URI uri = magikFile.getUri();
    final Location location = new Location(uri, node);
    final String methodName = definition.getMethodName();
    final Method method = magikType.addMethod(modifiers, location, methodName, parameters, assignmentParameter, callResult, loopResult);
    // Method doc.
    final String methodDoc = MagikCommentExtractor.extractDocComments(node).map(Token::getValue).map(// Strip '##'
    line -> line.substring(2)).collect(Collectors.joining("\n"));
    method.setDoc(methodDoc);
    // Save used types.
    final AstNode bodyNode = node.getFirstChild(MagikGrammar.BODY);
    final GlobalScope globalScope = magikFile.getGlobalScope();
    final Scope bodyScope = globalScope.getScopeForNode(bodyNode);
    Objects.requireNonNull(bodyScope);
    bodyScope.getSelfAndDescendantScopes().stream().flatMap(scope -> scope.getScopeEntriesInScope().stream()).filter(scopeEntry -> scopeEntry.isType(ScopeEntry.Type.GLOBAL) || scopeEntry.isType(ScopeEntry.Type.DYNAMIC)).map(ScopeEntry::getIdentifier).map(identifier -> {
        AbstractType type = this.typeKeeper.getType(globalRef);
        if (type == UndefinedType.INSTANCE) {
            return null;
        } else if (type == SelfType.INSTANCE) {
            // TODO: Does this actually happen?
            type = this.typeKeeper.getType(globalRef);
        }
        return type;
    }).filter(Objects::nonNull).forEach(method::addUsedType);
    // Save called method names (thus without type).
    node.getDescendants(MagikGrammar.METHOD_INVOCATION).stream().map(invocationNode -> {
        final MethodInvocationNodeHelper invocationHelper = new MethodInvocationNodeHelper(invocationNode);
        return invocationHelper.getMethodName();
    }).forEach(method::addCalledMethod);
    // Save used slot names.
    node.getDescendants(MagikGrammar.SLOT).stream().map(slotNode -> slotNode.getFirstChild(MagikGrammar.IDENTIFIER).getTokenValue()).forEach(method::addUsedSlot);
    final Path path = Paths.get(magikFile.getUri());
    this.indexedMethods.get(path).add(method);
    LOGGER.debug("Indexed method: {}", method);
}
Also used : Method(nl.ramsolutions.sw.magik.analysis.typing.types.Method) MagikType(nl.ramsolutions.sw.magik.analysis.typing.types.MagikType) AstNode(com.sonar.sslr.api.AstNode) SlottedExemplarDefinition(nl.ramsolutions.sw.magik.analysis.definitions.SlottedExemplarDefinition) IndexedType(nl.ramsolutions.sw.magik.analysis.typing.types.IndexedType) LoggerFactory(org.slf4j.LoggerFactory) SlottedType(nl.ramsolutions.sw.magik.analysis.typing.types.SlottedType) Package(nl.ramsolutions.sw.magik.analysis.typing.types.Package) AliasType(nl.ramsolutions.sw.magik.analysis.typing.types.AliasType) IndexedExemplarDefinition(nl.ramsolutions.sw.magik.analysis.definitions.IndexedExemplarDefinition) UndefinedType(nl.ramsolutions.sw.magik.analysis.typing.types.UndefinedType) EnumerationDefinition(nl.ramsolutions.sw.magik.analysis.definitions.EnumerationDefinition) Map(java.util.Map) URI(java.net.URI) Path(java.nio.file.Path) MagikGrammar(nl.ramsolutions.sw.magik.api.MagikGrammar) EnumSet(java.util.EnumSet) MethodInvocationNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.MethodInvocationNodeHelper) MethodDefinition(nl.ramsolutions.sw.magik.analysis.definitions.MethodDefinition) TypeAnnotationHandler(nl.ramsolutions.sw.magik.analysis.typing.TypeAnnotationHandler) PackageNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.PackageNodeHelper) Set(java.util.Set) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) List(java.util.List) Stream(java.util.stream.Stream) ParameterDefinition(nl.ramsolutions.sw.magik.analysis.definitions.ParameterDefinition) GlobalDefinition(nl.ramsolutions.sw.magik.analysis.definitions.GlobalDefinition) HashMap(java.util.HashMap) SelfType(nl.ramsolutions.sw.magik.analysis.typing.types.SelfType) ITypeKeeper(nl.ramsolutions.sw.magik.analysis.typing.ITypeKeeper) HashSet(java.util.HashSet) TypeParser(nl.ramsolutions.sw.magik.analysis.typing.TypeParser) AbstractType(nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType) Location(nl.ramsolutions.sw.magik.analysis.Location) Nullable(javax.annotation.Nullable) GlobalScope(nl.ramsolutions.sw.magik.analysis.scope.GlobalScope) MagikCommentExtractor(nl.ramsolutions.sw.magik.parser.MagikCommentExtractor) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) Token(com.sonar.sslr.api.Token) Slot(nl.ramsolutions.sw.magik.analysis.typing.types.Slot) Logger(org.slf4j.Logger) MagikFile(nl.ramsolutions.sw.magik.MagikFile) IOException(java.io.IOException) Parameter(nl.ramsolutions.sw.magik.analysis.typing.types.Parameter) NewDocParser(nl.ramsolutions.sw.magik.parser.NewDocParser) BinaryOperatorDefinition(nl.ramsolutions.sw.magik.analysis.definitions.BinaryOperatorDefinition) MixinDefinition(nl.ramsolutions.sw.magik.analysis.definitions.MixinDefinition) IntrinsicType(nl.ramsolutions.sw.magik.analysis.typing.types.IntrinsicType) PackageDefinition(nl.ramsolutions.sw.magik.analysis.definitions.PackageDefinition) Paths(java.nio.file.Paths) Definition(nl.ramsolutions.sw.magik.analysis.definitions.Definition) ScopeEntry(nl.ramsolutions.sw.magik.analysis.scope.ScopeEntry) Scope(nl.ramsolutions.sw.magik.analysis.scope.Scope) Collections(java.util.Collections) BinaryOperator(nl.ramsolutions.sw.magik.analysis.typing.BinaryOperator) ExpressionResult(nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResult) Path(java.nio.file.Path) GlobalScope(nl.ramsolutions.sw.magik.analysis.scope.GlobalScope) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) ExpressionResult(nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResult) Token(com.sonar.sslr.api.Token) Method(nl.ramsolutions.sw.magik.analysis.typing.types.Method) URI(java.net.URI) MagikType(nl.ramsolutions.sw.magik.analysis.typing.types.MagikType) MethodInvocationNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.MethodInvocationNodeHelper) NewDocParser(nl.ramsolutions.sw.magik.parser.NewDocParser) GlobalScope(nl.ramsolutions.sw.magik.analysis.scope.GlobalScope) Scope(nl.ramsolutions.sw.magik.analysis.scope.Scope) AbstractType(nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType) Parameter(nl.ramsolutions.sw.magik.analysis.typing.types.Parameter) AstNode(com.sonar.sslr.api.AstNode) ParameterDefinition(nl.ramsolutions.sw.magik.analysis.definitions.ParameterDefinition) Location(nl.ramsolutions.sw.magik.analysis.Location)

Example 27 with GlobalReference

use of nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference in project magik-tools by StevenLooman.

the class MagikIndexer method fillType.

private void fillType(final MagikType magikType, final MagikFile magikFile, final AstNode node, final String packageName, final Map<String, String> slots, final List<String> parents, @Nullable final AbstractType defaultParentType) {
    // Set location.
    final URI uri = magikFile.getUri();
    final Location location = new Location(uri, node);
    magikType.setLocation(location);
    // Set slots.
    magikType.clearSlots();
    slots.entrySet().forEach(entry -> {
        final String slotName = entry.getKey();
        final String slotTypeName = entry.getValue();
        final AbstractType slotType = this.typeParser.parseTypeString(slotTypeName, packageName);
        final Slot slot = magikType.addSlot(null, slotName);
        slot.setType(slotType);
    });
    // Parents.
    magikType.clearParents();
    final PackageNodeHelper packageHelper = new PackageNodeHelper(node);
    final String pakkageName = packageHelper.getCurrentPackage();
    parents.stream().forEach(parent -> {
        final GlobalReference parentGlobalRef = parent.indexOf(':') != -1 ? GlobalReference.of(parent) : GlobalReference.of(pakkageName, parent);
        final AbstractType parentType = this.typeKeeper.getType(parentGlobalRef);
        if (parentType == UndefinedType.INSTANCE) {
            LOGGER.warn("Parent type not found: {} from package: {}", parent, pakkageName);
        } else {
            magikType.addParent(parentType);
        }
    });
    // Default parent types ()
    boolean parentNonIntrinsicType = magikType.getParents().stream().anyMatch(parentType -> parentType instanceof SlottedType || parentType instanceof IndexedType);
    if (defaultParentType != null && !parentNonIntrinsicType) {
        magikType.addParent(defaultParentType);
    }
    // Type doc.
    final String typeDoc = MagikCommentExtractor.extractDocComments(node).map(Token::getValue).map(// Strip '##'
    line -> line.substring(2)).collect(Collectors.joining("\n"));
    magikType.setDoc(typeDoc);
}
Also used : Method(nl.ramsolutions.sw.magik.analysis.typing.types.Method) MagikType(nl.ramsolutions.sw.magik.analysis.typing.types.MagikType) AstNode(com.sonar.sslr.api.AstNode) SlottedExemplarDefinition(nl.ramsolutions.sw.magik.analysis.definitions.SlottedExemplarDefinition) IndexedType(nl.ramsolutions.sw.magik.analysis.typing.types.IndexedType) LoggerFactory(org.slf4j.LoggerFactory) SlottedType(nl.ramsolutions.sw.magik.analysis.typing.types.SlottedType) Package(nl.ramsolutions.sw.magik.analysis.typing.types.Package) AliasType(nl.ramsolutions.sw.magik.analysis.typing.types.AliasType) IndexedExemplarDefinition(nl.ramsolutions.sw.magik.analysis.definitions.IndexedExemplarDefinition) UndefinedType(nl.ramsolutions.sw.magik.analysis.typing.types.UndefinedType) EnumerationDefinition(nl.ramsolutions.sw.magik.analysis.definitions.EnumerationDefinition) Map(java.util.Map) URI(java.net.URI) Path(java.nio.file.Path) MagikGrammar(nl.ramsolutions.sw.magik.api.MagikGrammar) EnumSet(java.util.EnumSet) MethodInvocationNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.MethodInvocationNodeHelper) MethodDefinition(nl.ramsolutions.sw.magik.analysis.definitions.MethodDefinition) TypeAnnotationHandler(nl.ramsolutions.sw.magik.analysis.typing.TypeAnnotationHandler) PackageNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.PackageNodeHelper) Set(java.util.Set) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) List(java.util.List) Stream(java.util.stream.Stream) ParameterDefinition(nl.ramsolutions.sw.magik.analysis.definitions.ParameterDefinition) GlobalDefinition(nl.ramsolutions.sw.magik.analysis.definitions.GlobalDefinition) HashMap(java.util.HashMap) SelfType(nl.ramsolutions.sw.magik.analysis.typing.types.SelfType) ITypeKeeper(nl.ramsolutions.sw.magik.analysis.typing.ITypeKeeper) HashSet(java.util.HashSet) TypeParser(nl.ramsolutions.sw.magik.analysis.typing.TypeParser) AbstractType(nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType) Location(nl.ramsolutions.sw.magik.analysis.Location) Nullable(javax.annotation.Nullable) GlobalScope(nl.ramsolutions.sw.magik.analysis.scope.GlobalScope) MagikCommentExtractor(nl.ramsolutions.sw.magik.parser.MagikCommentExtractor) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) Token(com.sonar.sslr.api.Token) Slot(nl.ramsolutions.sw.magik.analysis.typing.types.Slot) Logger(org.slf4j.Logger) MagikFile(nl.ramsolutions.sw.magik.MagikFile) IOException(java.io.IOException) Parameter(nl.ramsolutions.sw.magik.analysis.typing.types.Parameter) NewDocParser(nl.ramsolutions.sw.magik.parser.NewDocParser) BinaryOperatorDefinition(nl.ramsolutions.sw.magik.analysis.definitions.BinaryOperatorDefinition) MixinDefinition(nl.ramsolutions.sw.magik.analysis.definitions.MixinDefinition) IntrinsicType(nl.ramsolutions.sw.magik.analysis.typing.types.IntrinsicType) PackageDefinition(nl.ramsolutions.sw.magik.analysis.definitions.PackageDefinition) Paths(java.nio.file.Paths) Definition(nl.ramsolutions.sw.magik.analysis.definitions.Definition) ScopeEntry(nl.ramsolutions.sw.magik.analysis.scope.ScopeEntry) Scope(nl.ramsolutions.sw.magik.analysis.scope.Scope) Collections(java.util.Collections) BinaryOperator(nl.ramsolutions.sw.magik.analysis.typing.BinaryOperator) ExpressionResult(nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResult) PackageNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.PackageNodeHelper) SlottedType(nl.ramsolutions.sw.magik.analysis.typing.types.SlottedType) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) AbstractType(nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType) Slot(nl.ramsolutions.sw.magik.analysis.typing.types.Slot) Token(com.sonar.sslr.api.Token) URI(java.net.URI) IndexedType(nl.ramsolutions.sw.magik.analysis.typing.types.IndexedType) Location(nl.ramsolutions.sw.magik.analysis.Location)

Example 28 with GlobalReference

use of nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference in project magik-tools by StevenLooman.

the class MagikIndexer method handleDefinition.

@SuppressWarnings("java:S1172")
private void handleDefinition(final MagikFile magikFile, final GlobalDefinition globalDefinition) {
    final String pakkage = globalDefinition.getPackage();
    final String identifier = globalDefinition.getName();
    final GlobalReference globalRef = typeParser.getGlobalRefeference(identifier, pakkage);
    if (this.typeKeeper.getType(globalRef) != null) {
        // Don't overwrite any existing types with a AliasType.
        return;
    }
    final String typeAnnotation = TypeAnnotationHandler.typeAnnotationForExpression(globalDefinition.getNode());
    final AbstractType aliasedType = typeAnnotation != null ? this.typeParser.parseTypeString(typeAnnotation, globalDefinition.getPackage()) : UndefinedType.INSTANCE;
    final AbstractType globalType = new AliasType(globalRef, aliasedType);
    this.typeKeeper.addType(globalType);
    final Path path = Paths.get(magikFile.getUri());
    this.indexedTypes.get(path).add(globalType);
}
Also used : Path(java.nio.file.Path) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) AbstractType(nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType) AliasType(nl.ramsolutions.sw.magik.analysis.typing.types.AliasType)

Example 29 with GlobalReference

use of nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference in project magik-tools by StevenLooman.

the class MagikIndexer method handleMethodDefinitionOther.

private void handleMethodDefinitionOther(final MagikFile magikFile, final MethodDefinition definition) {
    // Slot accessors, shared variables, shared constants.
    final GlobalReference globalRef = definition.getTypeGlobalReference();
    final AbstractType exemplarType = this.typeKeeper.getType(globalRef);
    if (exemplarType == UndefinedType.INSTANCE) {
        LOGGER.warn("Unknown type: {}", globalRef);
        return;
    }
    // Get method return types from docs, if any.
    final AstNode node = definition.getNode();
    final NewDocParser methodDocParser = new NewDocParser(node);
    final List<AbstractType> methodReturnTypes = methodDocParser.getReturnTypes().stream().map(typeStr -> this.typeParser.parseTypeString(typeStr, globalRef.getPakkage())).collect(Collectors.toList());
    // Get slot type from docs, if any.
    final AstNode statementNode = node.getFirstAncestor(MagikGrammar.STATEMENT);
    final AbstractType slotType;
    if (statementNode != null) {
        final NewDocParser exemplarDocParser = new NewDocParser(statementNode);
        final String slotName = definition.getMethodName();
        final String slotTypeStr = exemplarDocParser.getSlotTypes().get(slotName);
        slotType = this.typeParser.parseTypeString(slotTypeStr, globalRef.getPakkage());
    } else {
        slotType = UndefinedType.INSTANCE;
    }
    // Determine the result to use.
    final ExpressionResult result = !methodReturnTypes.isEmpty() ? new ExpressionResult(methodReturnTypes) : new ExpressionResult(slotType);
    // Create method.
    final MagikType magikType = (MagikType) exemplarType;
    final EnumSet<Method.Modifier> modifiers = definition.getModifiers().stream().map(modifier -> MagikIndexer.METHOD_MODIFIER_MAPPING.get(modifier)).collect(Collectors.toCollection(() -> EnumSet.noneOf(Method.Modifier.class)));
    final URI uri = magikFile.getUri();
    final Location location = new Location(uri, node);
    final String methodName = definition.getMethodName();
    final List<Parameter> parameters = Collections.emptyList();
    final Parameter assignmentParameter = null;
    final Method method = magikType.addMethod(modifiers, location, methodName, parameters, assignmentParameter, result);
    // TODO: Will this work?
    // TODO: Ensure we don't pick up class comment of def_slotted_exemplar.
    final String methodDoc = MagikCommentExtractor.extractDocComments(node).map(Token::getValue).collect(Collectors.joining("\n"));
    method.setDoc(methodDoc);
    final Path path = Paths.get(magikFile.getUri());
    this.indexedMethods.get(path).add(method);
    LOGGER.debug("Indexed method: {}", method);
}
Also used : Method(nl.ramsolutions.sw.magik.analysis.typing.types.Method) MagikType(nl.ramsolutions.sw.magik.analysis.typing.types.MagikType) AstNode(com.sonar.sslr.api.AstNode) SlottedExemplarDefinition(nl.ramsolutions.sw.magik.analysis.definitions.SlottedExemplarDefinition) IndexedType(nl.ramsolutions.sw.magik.analysis.typing.types.IndexedType) LoggerFactory(org.slf4j.LoggerFactory) SlottedType(nl.ramsolutions.sw.magik.analysis.typing.types.SlottedType) Package(nl.ramsolutions.sw.magik.analysis.typing.types.Package) AliasType(nl.ramsolutions.sw.magik.analysis.typing.types.AliasType) IndexedExemplarDefinition(nl.ramsolutions.sw.magik.analysis.definitions.IndexedExemplarDefinition) UndefinedType(nl.ramsolutions.sw.magik.analysis.typing.types.UndefinedType) EnumerationDefinition(nl.ramsolutions.sw.magik.analysis.definitions.EnumerationDefinition) Map(java.util.Map) URI(java.net.URI) Path(java.nio.file.Path) MagikGrammar(nl.ramsolutions.sw.magik.api.MagikGrammar) EnumSet(java.util.EnumSet) MethodInvocationNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.MethodInvocationNodeHelper) MethodDefinition(nl.ramsolutions.sw.magik.analysis.definitions.MethodDefinition) TypeAnnotationHandler(nl.ramsolutions.sw.magik.analysis.typing.TypeAnnotationHandler) PackageNodeHelper(nl.ramsolutions.sw.magik.analysis.helpers.PackageNodeHelper) Set(java.util.Set) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) List(java.util.List) Stream(java.util.stream.Stream) ParameterDefinition(nl.ramsolutions.sw.magik.analysis.definitions.ParameterDefinition) GlobalDefinition(nl.ramsolutions.sw.magik.analysis.definitions.GlobalDefinition) HashMap(java.util.HashMap) SelfType(nl.ramsolutions.sw.magik.analysis.typing.types.SelfType) ITypeKeeper(nl.ramsolutions.sw.magik.analysis.typing.ITypeKeeper) HashSet(java.util.HashSet) TypeParser(nl.ramsolutions.sw.magik.analysis.typing.TypeParser) AbstractType(nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType) Location(nl.ramsolutions.sw.magik.analysis.Location) Nullable(javax.annotation.Nullable) GlobalScope(nl.ramsolutions.sw.magik.analysis.scope.GlobalScope) MagikCommentExtractor(nl.ramsolutions.sw.magik.parser.MagikCommentExtractor) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) Token(com.sonar.sslr.api.Token) Slot(nl.ramsolutions.sw.magik.analysis.typing.types.Slot) Logger(org.slf4j.Logger) MagikFile(nl.ramsolutions.sw.magik.MagikFile) IOException(java.io.IOException) Parameter(nl.ramsolutions.sw.magik.analysis.typing.types.Parameter) NewDocParser(nl.ramsolutions.sw.magik.parser.NewDocParser) BinaryOperatorDefinition(nl.ramsolutions.sw.magik.analysis.definitions.BinaryOperatorDefinition) MixinDefinition(nl.ramsolutions.sw.magik.analysis.definitions.MixinDefinition) IntrinsicType(nl.ramsolutions.sw.magik.analysis.typing.types.IntrinsicType) PackageDefinition(nl.ramsolutions.sw.magik.analysis.definitions.PackageDefinition) Paths(java.nio.file.Paths) Definition(nl.ramsolutions.sw.magik.analysis.definitions.Definition) ScopeEntry(nl.ramsolutions.sw.magik.analysis.scope.ScopeEntry) Scope(nl.ramsolutions.sw.magik.analysis.scope.Scope) Collections(java.util.Collections) BinaryOperator(nl.ramsolutions.sw.magik.analysis.typing.BinaryOperator) ExpressionResult(nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResult) Path(java.nio.file.Path) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) ExpressionResult(nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResult) Method(nl.ramsolutions.sw.magik.analysis.typing.types.Method) URI(java.net.URI) MagikType(nl.ramsolutions.sw.magik.analysis.typing.types.MagikType) NewDocParser(nl.ramsolutions.sw.magik.parser.NewDocParser) AbstractType(nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType) Parameter(nl.ramsolutions.sw.magik.analysis.typing.types.Parameter) AstNode(com.sonar.sslr.api.AstNode) Location(nl.ramsolutions.sw.magik.analysis.Location)

Example 30 with GlobalReference

use of nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference in project magik-tools by StevenLooman.

the class MagikIndexer method handleDefinition.

private void handleDefinition(final MagikFile magikFile, final EnumerationDefinition definition) {
    final AstNode node = definition.getNode();
    final GlobalReference globalRef = definition.getGlobalReference();
    final MagikType type = this.typeKeeper.getType(globalRef) != UndefinedType.INSTANCE ? (MagikType) this.typeKeeper.getType(globalRef) : new SlottedType(globalRef);
    this.typeKeeper.addType(type);
    final Map<String, String> slots = Collections.emptyMap();
    final List<String> parents = definition.getParents();
    final MagikType defaultParentType = (MagikType) this.typeKeeper.getType(GlobalReference.of("sw:enumeration_value"));
    this.fillType(type, magikFile, node, globalRef.getPakkage(), slots, parents, defaultParentType);
    final Path path = Paths.get(magikFile.getUri());
    this.indexedTypes.get(path).add(type);
    LOGGER.debug("Indexed type: {}", type);
}
Also used : Path(java.nio.file.Path) SlottedType(nl.ramsolutions.sw.magik.analysis.typing.types.SlottedType) GlobalReference(nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference) AstNode(com.sonar.sslr.api.AstNode) MagikType(nl.ramsolutions.sw.magik.analysis.typing.types.MagikType)

Aggregations

GlobalReference (nl.ramsolutions.sw.magik.analysis.typing.types.GlobalReference)37 AstNode (com.sonar.sslr.api.AstNode)20 AbstractType (nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType)17 ITypeKeeper (nl.ramsolutions.sw.magik.analysis.typing.ITypeKeeper)15 MagikType (nl.ramsolutions.sw.magik.analysis.typing.types.MagikType)15 ExpressionResult (nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResult)14 Path (java.nio.file.Path)11 Method (nl.ramsolutions.sw.magik.analysis.typing.types.Method)11 MethodDefinitionNodeHelper (nl.ramsolutions.sw.magik.analysis.helpers.MethodDefinitionNodeHelper)10 GlobalScope (nl.ramsolutions.sw.magik.analysis.scope.GlobalScope)9 Scope (nl.ramsolutions.sw.magik.analysis.scope.Scope)9 List (java.util.List)8 SlottedType (nl.ramsolutions.sw.magik.analysis.typing.types.SlottedType)8 ArrayList (java.util.ArrayList)7 Collections (java.util.Collections)7 Collectors (java.util.stream.Collectors)7 ScopeEntry (nl.ramsolutions.sw.magik.analysis.scope.ScopeEntry)7 IndexedType (nl.ramsolutions.sw.magik.analysis.typing.types.IndexedType)7 IntrinsicType (nl.ramsolutions.sw.magik.analysis.typing.types.IntrinsicType)7 SelfType (nl.ramsolutions.sw.magik.analysis.typing.types.SelfType)7