diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java index 90dcc53c5b072bf5f79ddc2eda42509c33fcf304..0ad5099a2ad8ca2594c6df5561c8a08bd1bf6039 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.titan.common.logging.ErrorReporter; @@ -1212,4 +1213,8 @@ public final class Definitions extends Assignments implements ILocateableNode { } } } + + public Map getDefinitionMap() { + return definitionMap; + } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java index d9dda241d4dd95118e87e2dffdddfdd0bbbf31e7..e1140f9bf2b1391c528c2664e969a81a172305e5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java @@ -81,8 +81,10 @@ public final class Component_Type extends Type { public Component_Type(final ComponentTypeBody component) { this.componentBody = component; - componentBody.setFullNameParent(this); - componentBody.setMyType(this); + if (componentBody != null) { + componentBody.setFullNameParent(this); + componentBody.setMyType(this); + } } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/CompletionFinder.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/CompletionFinder.java index 7f1bc762b4b43ab30f72a66dc68b27ee4c60ba2c..f05eea9d23a432d99664fc3dc0fff8b0bfa3e939 100755 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/CompletionFinder.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/CompletionFinder.java @@ -37,6 +37,7 @@ public class CompletionFinder { private static final String DEFINITION = "[\\s]+" + IDENTIFIER + "[\\s]+" + IDENTIFIER + "[\\s]*" + ASSIGNOP; private static final String ASSIGNMENT = "(var|const)" + DEFINITION; private static final String FRIEND_REGEX = "[\\s]*friend module[\\s]*(.*)"; + private static final String COMPONENT = "(system|mtc|runs[\\s]+on)((\\s+" + IDENTIFIER + "$)|\\s*)"; public enum Completion { Component, Import, Friend, Assignment } public enum AssignmentType { Vardef, Varref, Constdef } @@ -65,11 +66,7 @@ public class CompletionFinder { basicTypes.put("integer", Type_type.TYPE_INTEGER); basicTypes.put("octetstring", Type_type.TYPE_OCTETSTRING); - comps.put("runs on", Completion.Component); - comps.put("system", Completion.Component); - comps.put("mtc", Completion.Component); comps.put("import from", Completion.Import); - comps.put("friend module", Completion.Friend); } public CompletionFinder(Module module) { @@ -159,6 +156,10 @@ public class CompletionFinder { return null; } + if (matchComponent(s)) { + return new ComponentContext(module, file, scope, offset); + } + final AssignmentMatch aMatch = matchAssignment(s); if (aMatch != null) { return new AssignmentContext(module, file, scope, offset, aMatch); @@ -181,6 +182,12 @@ public class CompletionFinder { } } + /** + * Checks if the context is a 'friend module' statement + * + * @param text + * @return + */ private List matchFriendModule(String text) { int j = 0; for (int i = text.length()-1; i >= 0; i--, j++) { @@ -234,6 +241,15 @@ public class CompletionFinder { } return null; } + + private boolean matchComponent(String text) { + final Pattern p = Pattern.compile(COMPONENT); + final Matcher m = p.matcher(text); + if (m.matches()) { + return true; + } + return false; + } public List getTokenList() { return tokenList; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ComponentContext.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ComponentContext.java new file mode 100755 index 0000000000000000000000000000000000000000..d8690e8ec828402feeb1e37c230a30362a5ecfaf --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ComponentContext.java @@ -0,0 +1,43 @@ +/****************************************************************************** + * Copyright (c) 2000-2022 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html + ******************************************************************************/ +package org.eclipse.titan.designer.editors.ttcn3editor; + +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.AST.Scope; +import org.eclipse.titan.designer.AST.IType.Type_type; +import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; +import org.eclipse.titan.designer.editors.ProposalCollector; +import org.eclipse.titan.designer.editors.controls.HoverContentType; +import org.eclipse.titan.designer.editors.controls.Ttcn3HoverContent; +import org.eclipse.titan.designer.graphics.ImageCache; + +/** + * Collects proposals for component context + * + * @author Miklos Magyari + * + */ +public class ComponentContext extends ProposalContext { + public ComponentContext(Module module, IFile file, Scope scope, int offset) { + super(module, file, scope, offset); + doFallback = false; + } + + @Override + public void getProposals(ProposalCollector propCollector) { + List defList = getAvailableDefsByType(Type_type.TYPE_COMPONENT); + for (Definition a : defList) { + Ttcn3HoverContent doc = a.getHoverContent(null); + propCollector.addProposal(a.getIdentifier(), ImageCache.getImageByType(Type_type.TYPE_COMPONENT), + doc != null ? doc.getText(HoverContentType.INFO) : ""); + } + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ProposalContext.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ProposalContext.java index d3fb736c9dc06b2e4d2c655bbb6b5f409c54e6ac..d120ae587e9c9230604f75bccd125a1eca9cefda 100755 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ProposalContext.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ProposalContext.java @@ -12,13 +12,16 @@ import java.util.List; import java.util.Map; import org.eclipse.core.resources.IFile; +import org.eclipse.jdt.internal.launching.VMDefinitionsContainer; import org.eclipse.titan.designer.AST.Assignment; import org.eclipse.titan.designer.AST.Assignments; import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.IType.Type_type; import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.AST.NamedBridgeScope; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; +import org.eclipse.titan.designer.AST.TTCN3.definitions.Definitions; import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock; import org.eclipse.titan.designer.editors.ProposalCollector; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; @@ -69,31 +72,24 @@ public abstract class ProposalContext { protected List getAvailableDefsByType(Type_type typeType) { List refs = new ArrayList(); - // FIXME : timestamp should not be null; this check is to avoid stack overflow - if (timestamp == null) { - return refs; - } - - StatementBlock sb = null; - if (scope instanceof StatementBlock ) { - sb = (StatementBlock)scope; - } else if (scope != null) { - sb = scope.getStatementBlockScope().getMyStatementBlock(); - } else { - return refs; - } - - if (sb == null) { + final Scope sc = getScope(); + if (sc == null) { return refs; } - final Map map = sb.getDefinitionMap(); + Map map = null; + if (sc instanceof StatementBlock) { + map = ((StatementBlock)sc).getDefinitionMap(); + } else if (sc instanceof Definitions) { + map = ((Definitions)sc).getDefinitionMap(); + } if (map == null) { return refs; } for (Map.Entry e : map.entrySet()) { final Definition def = e.getValue(); - if (def.getType(timestamp).getTypetype() == typeType) { + final IType deftype = def.getType(timestamp); + if (deftype != null && deftype.getTypetype() == typeType) { refs.add(def); } } @@ -104,21 +100,8 @@ public abstract class ProposalContext { protected List getAvailableAssignmentsByType(Type_type typeType) { List refs = new ArrayList(); - // FIXME : timestamp should not be null; this check is to avoid stack overflow - if (timestamp == null) { - return refs; - } - - StatementBlock sb = null; - if (scope instanceof StatementBlock ) { - sb = (StatementBlock)scope; - } else if (scope != null) { - sb = scope.getStatementBlockScope().getMyStatementBlock(); - } else { - return refs; - } - - if (sb == null) { + final Scope sc = getScope(); + if (sc == null) { return refs; } @@ -135,6 +118,22 @@ public abstract class ProposalContext { } return refs; } + + private Scope getScope() { + // FIXME : timestamp should not be null; this check is to avoid stack overflow + if (timestamp == null) { + return null; + } + + Scope sc = scope; + while (sc != null) { + if (sc instanceof Definitions || sc instanceof StatementBlock) { + break; + } + sc = sc.getParentScope(); + } + return sc; + } /** * Returns whether fallback is needed to the old proposal list compilation diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/graphics/ImageCache.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/graphics/ImageCache.java index 45e5e29e5c896cb2231a36ba4c62b008f5c7ad2e..1f654f7894120949942dd1f749d6363d525ff6a8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/graphics/ImageCache.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/graphics/ImageCache.java @@ -16,6 +16,7 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.titan.designer.AST.IType.Type_type; import org.eclipse.titan.designer.AST.TTCN3.types.BitString_Type; import org.eclipse.titan.designer.AST.TTCN3.types.CharString_Type; +import org.eclipse.titan.designer.AST.TTCN3.types.Component_Type; import org.eclipse.titan.designer.AST.TTCN3.types.Float_Type; import org.eclipse.titan.designer.AST.TTCN3.types.HexString_Type; import org.eclipse.titan.designer.AST.TTCN3.types.Integer_Type; @@ -43,6 +44,7 @@ public final class ImageCache { static { typeCache.put(Type_type.TYPE_BITSTRING, (new BitString_Type().getOutlineIcon())); typeCache.put(Type_type.TYPE_CHARSTRING, (new CharString_Type().getOutlineIcon())); + typeCache.put(Type_type.TYPE_COMPONENT, (new Component_Type(null).getOutlineIcon())); typeCache.put(Type_type.TYPE_TTCN3_ENUMERATED, (new TTCN3_Enumerated_Type(null).getOutlineIcon())); typeCache.put(Type_type.TYPE_HEXSTRING, (new HexString_Type().getOutlineIcon())); typeCache.put(Type_type.TYPE_INTEGER, (new Integer_Type().getOutlineIcon()));