/* * Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC * All rights reserved. * * The source code of this document is proprietary work, and is not licensed for * distribution. For information about licensing, contact Sam Harwell at: * sam@tunnelvisionlabs.com */ package org.antlr.works.editor.grammar.codemodel.impl; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.antlr.works.editor.grammar.codemodel.LexerRuleModel; import org.antlr.works.editor.grammar.codemodel.ModeModel; import org.antlr.works.editor.grammar.codemodel.RuleModel; import org.antlr.works.editor.grammar.codemodel.TokenData; import org.antlr.works.editor.grammar.codemodel.TokenVocabModel; import org.netbeans.api.annotations.common.NonNull; /** * * @author Sam Harwell */ public class FileVocabModelImpl extends AbstractTokenVocabModel { public FileVocabModelImpl(@NonNull FileModelImpl file) { super(file.getName(), file); } @Override @NonNull public FileModelImpl getFile() { FileModelImpl fileModel = super.getFile(); assert fileModel != null; return fileModel; } @Override public Collection<? extends TokenData> getTokens() { Map<String, TokenData> data = new HashMap<>(); // imports for (ImportDeclarationModelImpl importDecl : getFile().getImportDeclarations()) { for (PackageModelImpl packageModel : CodeModelCacheImpl.getInstance().resolvePackages(importDecl)) { for (FileModelImpl fileModel : packageModel.getFiles()) { for (TokenData tokenData : fileModel.getVocabulary().getTokens()) { data.put(tokenData.getName(), tokenData); } } } } // tokenVocab option for (TokenVocabDeclarationModelImpl tokenVocabDecl : getFile().getTokenVocabDeclaration()) { for (TokenVocabModel tokenVocab : tokenVocabDecl.resolve()) { for (TokenData tokenData : tokenVocab.getTokens()) { data.put(tokenData.getName(), tokenData); } } } // rules in the current grammar for (RuleModel rule : getFile().getRules()) { if (!(rule instanceof LexerRuleModel)) { continue; } TokenData tokenData = ((LexerRuleModel)rule).getTokenData(); if (tokenData != null) { data.put(tokenData.getName(), tokenData); } } // rules in modes in the current grammar for (ModeModel mode : getFile().getModes()) { for (RuleModel rule : mode.getRules()) { if (!(rule instanceof LexerRuleModel)) { continue; } TokenData tokenData = ((LexerRuleModel)rule).getTokenData(); if (tokenData != null) { data.put(tokenData.getName(), tokenData); } } } return data.values(); } }