/*
* 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.tvl.goworks.editor.go.codemodel.impl;
import java.util.Collection;
import org.antlr.netbeans.editor.text.OffsetRegion;
import org.netbeans.api.annotations.common.CheckForNull;
import org.netbeans.api.annotations.common.NonNull;
import org.netbeans.api.annotations.common.NullAllowed;
import org.openide.filesystems.FileObject;
import org.tvl.goworks.editor.go.codemodel.CodeElementPositionRegion;
import org.tvl.goworks.editor.go.codemodel.FileModel;
import org.tvl.goworks.project.GoProject;
/**
*
* @author Sam Harwell
*/
public class FileModelImpl extends AbstractCodeElementModel implements FileModel {
private final FileObject fileObject;
private final FreezableArrayList<PackageDeclarationModelImpl> packageDeclarations = new FreezableArrayList<>();
private final FreezableArrayList<ImportDeclarationModelImpl> importDeclarations = new FreezableArrayList<>();
private final FreezableArrayList<TypeModelImpl> types = new FreezableArrayList<>();
private final FreezableArrayList<ConstModelImpl> constants = new FreezableArrayList<>();
private final FreezableArrayList<VarModelImpl> vars = new FreezableArrayList<>();
private final FreezableArrayList<FunctionModelImpl> functions = new FreezableArrayList<>();
@SuppressWarnings("unchecked")
private final ProxyCollection<AbstractCodeElementModel> codeElements = new ProxyCollection<>(packageDeclarations, importDeclarations, types, constants, vars, functions);
public FileModelImpl(@NonNull FileObject fileObject, @NullAllowed GoProject project, @NonNull String packagePath) {
super(fileObject.getNameExt(), project, packagePath);
this.fileObject = fileObject;
}
public FileModelImpl(@NonNull String name, @NullAllowed GoProject project, @NonNull String packagePath) {
super(name, project, packagePath);
this.fileObject = null;
}
@Override
public CodeElementPositionRegion getSeek() {
if (getFileObject() == null) {
return null;
}
OffsetRegion region = new OffsetRegion(0, 0);
return new CodeElementPositionRegionImpl(this, region);
}
@Override
public CodeElementPositionRegion getSpan() {
if (getFileObject() == null) {
return null;
}
OffsetRegion region = new OffsetRegion(0, 0);
return new CodeElementPositionRegionImpl(this, region);
}
@Override
public FileModelImpl getFile() {
return this;
}
@CheckForNull
public FileObject getFileObject() {
return fileObject;
}
@Override
public Collection<AbstractCodeElementModel> getMembers() {
return codeElements;
}
@Override
public Collection<PackageDeclarationModelImpl> getPackageDeclarations() {
return packageDeclarations;
}
@Override
public Collection<ImportDeclarationModelImpl> getImportDeclarations() {
return importDeclarations;
}
@Override
public Collection<TypeModelImpl> getTypes() {
return types;
}
@Override
public Collection<TypeModelImpl> getTypes(String name) {
return CodeModelCacheImpl.findElementsByName(getTypes(), name);
}
@Override
public Collection<ConstModelImpl> getConstants() {
return constants;
}
@Override
public Collection<ConstModelImpl> getConstants(String name) {
return CodeModelCacheImpl.findElementsByName(getConstants(), name);
}
@Override
public Collection<VarModelImpl> getVars() {
return vars;
}
@Override
public Collection<VarModelImpl> getVars(String name) {
return CodeModelCacheImpl.findElementsByName(getVars(), name);
}
@Override
public Collection<FunctionModelImpl> getFunctions() {
return functions;
}
@Override
public Collection<FunctionModelImpl> getFunctions(String name) {
return CodeModelCacheImpl.findElementsByName(getFunctions(), name);
}
@Override
protected void freezeImpl() {
packageDeclarations.freeze();
importDeclarations.freeze();
types.freeze();
constants.freeze();
vars.freeze();
functions.freeze();
super.freezeImpl();
}
}