| /******************************************************************************* |
| * Copyright (c) 2005, 2016 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.ruby.internal.parser.mixin; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.dltk.core.IScriptProject; |
| import org.eclipse.dltk.core.IShutdownListener; |
| import org.eclipse.dltk.core.mixin.IMixinElement; |
| import org.eclipse.dltk.core.mixin.MixinModel; |
| import org.eclipse.dltk.ruby.core.RubyLanguageToolkit; |
| import org.eclipse.dltk.ruby.core.RubyPlugin; |
| import org.eclipse.dltk.ruby.typeinference.RubyClassType; |
| |
| public class RubyMixinModel implements IShutdownListener { |
| |
| private static RubyMixinModel instance; |
| |
| public static RubyMixinModel getWorkspaceInstance() { |
| synchronized (instances) { |
| if (instance == null) |
| instance = new RubyMixinModel(null); |
| return instance; |
| } |
| } |
| |
| private static final Map<IScriptProject, RubyMixinModel> instances = new HashMap<IScriptProject, RubyMixinModel>(); |
| |
| public static synchronized RubyMixinModel getInstance(IScriptProject project) { |
| Assert.isNotNull(project); |
| synchronized (instances) { |
| RubyMixinModel mixinModel = instances.get(project); |
| if (mixinModel == null) { |
| mixinModel = new RubyMixinModel(project); |
| instances.put(project, mixinModel); |
| } |
| return mixinModel; |
| } |
| } |
| |
| /** |
| * @param key |
| * @return |
| */ |
| public static void clearKeysCache(String key) { |
| final RubyMixinModel[] models; |
| synchronized (instances) { |
| if (instance != null) { |
| instance.getRawModel().clearKeysCache(key); |
| } |
| models = instances.values().toArray( |
| new RubyMixinModel[instances.size()]); |
| } |
| for (RubyMixinModel mixinModel : models) { |
| mixinModel.getRawModel().clearKeysCache(key); |
| } |
| } |
| |
| private final MixinModel model; |
| |
| private RubyMixinModel(IScriptProject project) { |
| model = new MixinModel(RubyLanguageToolkit.getDefault(), project); |
| RubyPlugin.getDefault().addShutdownListener(this); |
| } |
| |
| public MixinModel getRawModel() { |
| return model; |
| } |
| |
| public RubyMixinClass createRubyClass(RubyClassType type) { |
| return (RubyMixinClass) createRubyElement(type.getModelKey()); |
| } |
| |
| public IRubyMixinElement createRubyElement(String key) { |
| if (key.equals("Object")) { //$NON-NLS-1$ |
| return new RubyObjectMixinClass(this, true); |
| } else if (key.equals("Object%")) { //$NON-NLS-1$ |
| return new RubyObjectMixinClass(this, false); |
| } |
| IMixinElement mixinElement = model.get(key); |
| if (mixinElement != null) { |
| return createRubyElement(mixinElement); |
| } |
| return null; |
| } |
| |
| public IRubyMixinElement createRubyElement(IMixinElement element) { |
| Assert.isNotNull(element); |
| if (element.getKey().equals("Object")) { //$NON-NLS-1$ |
| return new RubyObjectMixinClass(this, true); |
| } else if (element.getKey().equals("Object%")) { //$NON-NLS-1$ |
| return new RubyObjectMixinClass(this, false); |
| } |
| Object[] objects = element.getAllObjects(); |
| if (objects == null) |
| return null; |
| for (int i = 0; i < objects.length; i++) { |
| RubyMixinElementInfo obj = (RubyMixinElementInfo) objects[i]; |
| if (obj == null || obj.getObject() == null) |
| continue; |
| switch (obj.getKind()) { |
| case RubyMixinElementInfo.K_CLASS: |
| case RubyMixinElementInfo.K_SUPER: |
| case RubyMixinElementInfo.K_VIRTUAL: |
| return new RubyMixinClass(this, element.getKey(), false); |
| case RubyMixinElementInfo.K_MODULE: |
| return new RubyMixinClass(this, element.getKey(), true); |
| case RubyMixinElementInfo.K_METHOD: |
| return new RubyMixinMethod(this, element.getKey()); |
| case RubyMixinElementInfo.K_ALIAS: |
| return new RubyMixinAlias(this, element.getKey()); |
| case RubyMixinElementInfo.K_VARIABLE: |
| return new RubyMixinVariable(this, element.getKey()); |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| public void shutdown() { |
| model.stop(); |
| } |
| } |