!AColorSelectorMorph commentStamp: ''! ColorComponentSelector showing an alpha gradient over a hatched background.! !AColorSelectorMorph methodsFor: 'accessing' stamp: ''! color: aColor "Set the gradient colors." super color: aColor beOpaque. self fillStyle: self defaultFillStyle! ! !AColorSelectorMorph methodsFor: 'drawing' stamp: ''! drawOn: aCanvas "Draw a hatch pattern first." aCanvas fillRectangle: self innerBounds fillStyle: (InfiniteForm with: self hatchForm). super drawOn: aCanvas! ! !AColorSelectorMorph methodsFor: 'initialization' stamp: ''! initialize "Initialize the receiver." super initialize. self value: 1.0; color: Color black! ! !AColorSelectorMorph methodsFor: 'private' stamp: ''! hatchForm "Answer a form showing a grid hatch pattern." ^ColorPresenterMorph hatchForm! ! !AColorSelectorMorph methodsFor: 'protocol' stamp: ''! defaultFillStyle "Answer the hue gradient." ^(GradientFillStyle colors: {self color alpha: 0. self color}) origin: self topLeft; direction: (self bounds isWide ifTrue: [self width@0] ifFalse: [0@self height])! ! !AColorSelectorMorph methodsFor: 'visual properties' stamp: ''! fillStyle: fillStyle "If it is a color then override with gradient." fillStyle isColor ifTrue: [self color: fillStyle] ifFalse: [super fillStyle: fillStyle]! ! !AColorSelectorMorph methodsFor: '*Athens-Morphic' stamp: ''! drawOnAthensCanvas: anAthensCanvas anAthensCanvas setPaint: (InfiniteForm with: self hatchForm). anAthensCanvas drawShape: self innerBounds. super drawOnAthensCanvas: anAthensCanvas! ! !ASTCache commentStamp: ''! I am a simple cache for AST nodes corresponding to CompiledMethods in the image. The cache is emptied when the image is saved. The cached #ast is for one interesting for speed (that is, in situations where you ask for it often). The other use-case is if you want to annotate the AST and keep that annotation around (till the next image save, but you can subscribe to ASTCacheReset and re-install the AST in the cache after cleaning. (This is used by MetaLinks to make sure they survive image restart). The last thing that it provides is that we do have a quite powerful mapping between bytecode/text/context and the AST. Regardless of how you navigate, you get the same object. e.g. even this one works: [ 1+2 ] sourceNode == thisContext method ast blockNodes first **NOTE** due to the cached AST, Modification of the AST can be a problem. Code that wants to modify the AST without making sure the compiledMethod is in sync later should use #parseTree. ! !ASTCache methodsFor: 'accessing' stamp: ''! at: aCompiledMethod "for doit methods, the ast is stored in the method propery" ^ aCompiledMethod propertyAt: #ast ifAbsent: [ self at: aCompiledMethod ifAbsentPut: [ self class cacheMissStrategy getASTFor: aCompiledMethod ] ]! ! !ASTCache methodsFor: 'initialization' stamp: ''! reset self removeAll! ! !ASTCache class methodsFor: 'accessing' stamp: ''! cacheMissStrategy: aCacheMissStrategy ^ CacheMissStrategy := aCacheMissStrategy! ! !ASTCache class methodsFor: 'system startup' stamp: ''! shutDown self reset! ! !ASTCache class methodsFor: 'accessing' stamp: ''! at: aCompiledMethod ^ self default at: aCompiledMethod! ! !ASTCache class methodsFor: 'accessing' stamp: ''! cacheMissStrategy ^ CacheMissStrategy ifNil: [ CacheMissStrategy := ASTCacheMissStrategy new ]! ! !ASTCache class methodsFor: 'accessing' stamp: ''! default ^ default ifNil: [ SessionManager default registerSystemClassNamed: self name. default := self new ]! ! !ASTCache class methodsFor: 'private - announcements' stamp: ''! announceCacheReset SystemAnnouncer uniqueInstance announce: ASTCacheReset new! ! !ASTCache class methodsFor: 'accessing' stamp: ''! default: anASTCache default := anASTCache! ! !ASTCache class methodsFor: 'class initialization' stamp: ''! reset '. self stream lf; << ''; lf; << ''; lf; << '
'; lf; << '

Dependency analysis

'; lf.! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! publishPackagesToRemoveDependants "Standard dependency report do not care about packages to remove for the bootsrap. Nothing to do."! ! !DADependenciesHTMLPublisher methodsFor: 'html utilities' stamp: ''! styleSheet: styleSheetUrl stream << ''; lf! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! publishDependenciesCaption self stream lf; << (self warningLabel: 'Ignored dependency'); lf! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! publish: aPackageName dependencies: dependencies dependants: dependants | dependantLinks | dependantLinks := dependants sorted collect: [ :name | '' , name , '' ]. stream << ' ' << (self htmlForPackage: aPackageName) << ' ' << (self sizeBadgeFor: dependencies) << Character space << (self htmlForDependencies: dependencies sorted of: aPackageName) << Character space << (self htmlForIgnoredDependenciesOf: aPackageName) << ' ' << (self sizeBadgeFor: dependants) << Character space << (Character space join: dependantLinks) << ' '; lf.! ! !DADependenciesHTMLPublisher methodsFor: 'html utilities' stamp: ''! javaScript: scriptFileName stream << ''; lf! ! !DADependenciesHTMLPublisher methodsFor: 'html utilities' stamp: ''! accordion: id name: name headingContent: heading body: body stream << '
'. stream << '
'. stream << body << '
'. stream << '
'; lf! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! htmlForIgnoredDependenciesOf: aPackageName ^ String streamContents: [ :str | (RPackage organizer packageNamed: aPackageName) ignoredDependencies do: [ :dependency | str << (self warningLabel: dependency) ] separatedBy: [ str space ] ]! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! htmlForPackage: aPackageName ^ aPackageName ! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! publishHTMLFooter self stream lf; << '
'; lf; << ''; lf; << ''; lf! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! publishSetup | body | body := String streamContents: [ :str | str << 'Image version: '; << self imageVersionString; << '
Analysis run on '; << report analysisRunString ; << '
' ]. self accordion: 'accordionSetup' name: 'Setup' headingContent: 'Analysis setup' body: body! ! !DADependenciesHTMLPublisher methodsFor: 'accessing' stamp: ''! stream ^ stream! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! publishWarnings | body | body := String streamContents: [ :str | (report warnings sorted: [ :a :b | a package < b package ]) do: [ :warning | str << warning messageText << '
' ] ]. self accordion: 'accordionWarnings' name: 'Warnings' headingContent: 'Warnings ' , (self sizeBadgeFor: report warnings) body: body. stream << '
'; lf. ! ! !DADependenciesHTMLPublisher methodsFor: 'initialization' stamp: ''! initializeWithReport: aCGODependencyReport stream: aStream super initialize. stream := aStream. report := aCGODependencyReport! ! !DADependenciesHTMLPublisher methodsFor: 'publishing' stamp: ''! publishDependencies stream << ' '; lf. report dependenciesAndKnownDependantsDo: [ :packageName :dependencies :dependants | self publish: packageName dependencies: dependencies dependants: dependants ]. self publishPackagesToRemoveDependants. stream << '
Package Dependencies Dependants
'; lf! ! !DADependenciesHTMLPublisher class methodsFor: 'publishing' stamp: ''! publishReportFrom: aCGODependencyReport stream: aStream self basicNew initializeWithReport: aCGODependencyReport stream: aStream; publish ! ! !DADependenciesHTMLPublisher class methodsFor: 'publishing' stamp: ''! generateSystemReport