Top Banner
SCOPING TIPS & TRICKS SEBASTIAN ZARNEKOW
26
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Scoping Tips and Tricks

SCOPING TIPS & TRICKSSEBASTIAN ZARNEKOW

Page 2: Scoping Tips and Tricks

IN COMPUTER PROGRAMMING, THE SCOPE OF A NAME BINDING – AN ASSOCIATION OF A NAME TO AN ENTITY, SUCH AS A VARIABLE – IS THE PART OF A COMPUTER PROGRAM WHERE THE BINDING IS VALID: WHERE THE NAME CAN BE USED TO REFER TO THE ENTITY. IN OTHER PARTS OF THE PROGRAM THE NAME MAY REFER TO A DIFFERENT ENTITY (IT MAY HAVE A DIFFERENT BINDING), OR TO NOTHING AT ALL (IT MAY BE UNBOUND). THE SCOPE OF A BINDING IS ALSO KNOWN AS THE VISIBILITY OF AN ENTITY, PARTICULARLY IN OLDER OR MORE TECHNICAL LITERATURE – THIS IS FROM THE PERSPECTIVE OF THE REFERENCED ENTITY, NOT THE REFERENCING NAME. [..] THE TERM "SCOPE" IS ALSO USED TO REFER TO THE SET OF ALL ENTITIES THAT ARE VISIBLE OR NAMES THAT ARE VALID WITHIN A PORTION OF THE PROGRAM OR AT A GIVEN POINT IN A PROGRAM, WHICH IS MORE CORRECTLY REFERRED TO AS CONTEXT OR ENVIRONMENT.

http://en.wikipedia.org/wiki/Scope_%28computer_science%29

Page 3: Scoping Tips and Tricks

IN COMPUTER PROGRAMMING, THE SCOPE OF A NAME BINDING – AN ASSOCIATION OF A NAME TO AN ENTITY, SUCH AS A VARIABLE – IS THE PART OF A COMPUTER PROGRAM WHERE THE BINDING IS VALID: WHERE THE NAME CAN BE USED TO REFER TO THE ENTITY. IN OTHER PARTS OF THE PROGRAM THE NAME MAY REFER TO A DIFFERENT ENTITY (IT MAY HAVE A DIFFERENT BINDING), OR TO NOTHING AT ALL (IT MAY BE UNBOUND). THE SCOPE OF A BINDING IS ALSO KNOWN AS THE VISIBILITY OF AN ENTITY, PARTICULARLY IN OLDER OR MORE TECHNICAL LITERATURE – THIS IS FROM THE PERSPECTIVE OF THE REFERENCED ENTITY, NOT THE REFERENCING NAME. [..] THE TERM "SCOPE" IS ALSO USED TO REFER TO THE SET OF ALL ENTITIES THAT ARE VISIBLE OR NAMES THAT ARE VALID WITHIN A PORTION OF THE PROGRAM OR AT A GIVEN POINT IN A PROGRAM, WHICH IS MORE CORRECTLY REFERRED TO AS CONTEXT OR ENVIRONMENT.

http://en.wikipedia.org/wiki/Scope_%28computer_science%29

Page 4: Scoping Tips and Tricks

IScope and its Clients

Linking:getSingleElement(QualifiedName)

ContentAssist:getAllElements()

Serialization:getElements(EObject)

Page 5: Scoping Tips and Tricks

IScope DisassembledMultimap-like Structure

Two Different Keys

Multimap<QualifiedName, IEObjectDescription>

Multimap<EObject, IEObjectDescription>

Typically Stacked

Shadowing Semantics

Page 6: Scoping Tips and Tricks

Multimaps from FOP View

Multimap<K, V>

~= Map<K, Collection<V>>

~= get(K): Collection<V>

~= (K) -> V*

Page 7: Scoping Tips and Tricks

IScope from FOP View

{ (QualifiedName) -> IEObjectDescription*, (EObject) -> IEObjectDescription* () -> IEObjectDescription*}

Page 8: Scoping Tips and Tricks

IEObjectDescription

{ Name, QualifiedName, URI, String* }

#getEObjectOrProxy

Page 9: Scoping Tips and Tricks

IScopeProvidergetScope(EObject ctx, EReference ref):IScope

EObject ctx

Linking: Owner of Reference

Content Assist: Best Known Container

EReference ref

Reflective representation, e.g. TYPE__SUPER_TYPE for Type.getSuperType()

Page 10: Scoping Tips and Tricks

PUTTING IT TOGETHER

Page 11: Scoping Tips and Tricks

Embrace (QN)->IEODDecorate the Produced Scope, e.greturn new SimpleScope(orig) {..}

Override #getSingleElement(QualifiedName)

Decorate the IEObjectDescriptionreturn new AliasedEObjectDescription {..}

Perform Side-Effect on #getEObjectOrProxy

Page 12: Scoping Tips and Tricks

Validation Meets Scoping

Don’t Limit Content of Scope ‘Arbitrarily’

Include Potentially Invalid Descriptions

Improve User Experience (Navigation, Error Messages)

Add Error or Warning, if Description is Invalidctx.eResource().getErrors().add(..)

Page 13: Scoping Tips and Tricks

Validation Meets Scopingpublic class ErrorAddingDescription extends AliasedEObjectDescription { ErrorAddingDescription(EObject ctx, IEObjectDescription desc) {..} @Override public EObject getEObjectOrProxy() { ctx.eResource().getErrors().add( new EObjectDiagnosticImpl(..)) return super.getEObjectOrProxy(); } }

Page 14: Scoping Tips and Tricks

Detect Unused Locals

Mark Local Declarations as Unused

Local Vars

Import Declarations

Potentially Expensive Validation

Install EMF Adapter on Used Instances

Page 15: Scoping Tips and Tricks

public class MarkAsUsedDescription extends AliasedEObjectDescription { MarkAsUsedDescription(EObject ctx, IEObjectDescription desc) { .. } @Override public EObject getEObjectOrProxy() { EObject result = super.getEObjectOrProxy(); if (result.eResource() == ctx.eResource()) UsageMarkerAdapter.markAsUsed(result); return result; } }

Detect Unused Locals

Page 16: Scoping Tips and Tricks

@Checkpublic void markAsUnused(LocalVar var) { if (UsageMarkerAdapter.isUnused(var)) { addWarning(var, ..) } }

Detect Unused Locals

Page 17: Scoping Tips and Tricks

Avoid Follow-up Errors

Encountered EMF Proxy During getScope(..)

Often Follow-Up Error Situation

Return Scope with Dummy Description

Don’t Produce Unnecessary Errors

Avoid Subsequent Resolution Attempts

Page 18: Scoping Tips and Tricks

public class ErrorScope implements IScope { ErrorScope(EObject ctx, EReference ref) { .. } public IEObjectDescription getSingleElement( QualifiedName name) { return new ErrorDescription(name, ctx, ref); } .. }

Avoid Follow-up Errors

Page 19: Scoping Tips and Tricks

Avoid Follow-up Errorspublic class ErrorDescription extends AliasedEObjectDescription { ErrorDescription(QualifiedName name, EObject ctx, EReference ref) { .. } @Override public EObject getEObjectOrProxy() { return (EObject) ctx.eGet(ref, false); // simplified } }

Page 20: Scoping Tips and Tricks

Dynamic Scopes

Dynamic Languages Allow to Refer Anything

Returns Dynamic Description if Name is Unknown

Record Obtained Descriptions for Later Reuse

Special Case of ErrorScope

Page 21: Scoping Tips and Tricks

COMMON PITFALLS

Page 22: Scoping Tips and Tricks

This is not the context you’re looking forgetScope(EObject ctx, EReference ref)

Content Assist Works on Invalid Documents

Parser Produces Trees rather than a Forest

Best Effort Context Computation

Beware of ClassCastException in getScope(..)

Page 23: Scoping Tips and Tricks

Don’t Enumerate the WorldAvoid eResource().getResourceSet()

and eAllContents()

Embrace the Defaults

Index Queries

Local Resource Contents is Indexed & Cached

Cache Scopes if Necessary (e.g. MapBasedScope)

!

Page 24: Scoping Tips and Tricks

Get Rid of Reflective API

Extendo.e.x.s.impl.DelegatingScopeProvider

Implement #getScope(..) based on EReferenceif (ref == MyDslPackage.Literals…)

Generally Faster & Easier to Debug

Page 25: Scoping Tips and Tricks

Avoid Loading the WorldPut Necessary Information Into Index

User Data Makes Great Filter-Criteria

Index Objects with Aliases / Multiple Names

Use AliasedEObjectDescription for Local Synonyms

If you invoke getEObjectOrProxy() you’re doing it wrong. Usually.

Page 26: Scoping Tips and Tricks

Q & A