"{ Package: 'stx:libbasic' }"
Object subclass:#ProgrammingLanguage
instanceVariableNames:''
classVariableNames:'LanguageQuerySignal'
poolDictionaries:''
category:'Kernel-ProgrammingLanguages'
!
ProgrammingLanguage class instanceVariableNames:'Instance'
"
No other class instance variables are inherited by this class.
"
!
!ProgrammingLanguage class methodsFor:'initialization'!
initialize
LanguageQuerySignal :=
QuerySignal new
nameClass:self message:#languageQuerySignal;
notifierString:'asking for current language';
handlerBlock:[:ex | ex proceedWith:SmalltalkLanguage instance].
"Created: / 12-08-2009 / 14:56:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
"Modified: / 16-08-2009 / 10:36:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage class methodsFor:'instance creation'!
forFile: aFilename
"
Answers a language for given source file. If none is found,
SmalltalkLanguage is returned (to provide backward compatibility)"
^ self instancesDetect: [:each | each canReadSourceFile: aFilename ]
ifNone: [ SmalltalkLanguage instance ]
"Created: / 16-08-2009 / 10:08:44 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
forStream: aStream
"
Answers a language for given source stream. If none is found,
SmalltalkLanguage is returned (to provide backward compatibility)"
aStream isFileStream ifFalse: [ ^ SmalltalkLanguage instance ].
^ self forFile: aStream fileName
"Created: / 16-08-2009 / 10:56:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
named: aString
^ self
instancesDetect:[:each | each name = aString ]
ifNone: [ self error: 'No language named ' , aString ].
"
ProgrammingLanguage named: 'Smalltalk'
ProgrammingLanguage named: 'Ruby'"
"Created: / 15-08-2009 / 22:40:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
"Modified: / 16-08-2009 / 10:58:01 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage class methodsFor:'Signal constants'!
languageQuerySignal
^LanguageQuerySignal
"Created: / 12-08-2009 / 14:57:07 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage class methodsFor:'accessing'!
all
"
Anwers a collection of all available languages
"
^self allSubclasses collect:[:each|each instance]
"
ProgrammingLanguage all
"
"Created: / 16-08-2009 / 13:43:41 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
current
"
ProgrammingLanguage current
"
^LanguageQuerySignal query
"Created: / 12-08-2009 / 15:02:59 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
instance
Instance ifNil:[Instance := self new].
^Instance
"Created: / 16-08-2009 / 10:36:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage class methodsFor:'enumerating'!
allDo: aBlock
^self allSubclassesDo:
[:each|aBlock value: each instance]
"Created: / 16-08-2009 / 14:07:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage class methodsFor:'private'!
instancesDetect: detectBlock ifNone: failBlock
self allSubclasses
do:[:cls|(detectBlock value: cls instance) ifTrue:[^cls instance]].
^failBlock value
"Created: / 16-08-2009 / 10:57:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage methodsFor:'accessing'!
name
"
Answers a human-readable name of myself:
'Smalltalk' for SmalltalkLanguage,
'Ruby' for RubyLanguage...
"
^ self subclassResponsibility
"Created: / 15-08-2009 / 22:38:16 / Jan Vrany <vranyj1@fel.cvut.cz>"
"Modified: / 16-08-2009 / 10:47:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
sourceFileSuffix
"
Answers a default suffix for source files, i.e.
'st' for Smalltalk, 'js' for JavaScript or 'rb' for Ruby'
"
^self subclassResponsibility
"Created: / 16-08-2009 / 10:42:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage methodsFor:'accessing - classes'!
sourceFileReaderClass
"
Answers a class that can be used for
reading & compiling source files
"
^self subclassResponsibility
"Created: / 16-08-2009 / 09:00:23 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
sourceFileWriterClass
"
Answers a class is used for source file
writing (i.e. file-out)
"
^self subclassResponsibility
"Created: / 16-08-2009 / 09:40:19 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage methodsFor:'printing & storing'!
storeOn:aStream
self class == ProgrammingLanguage
ifTrue:
[super storeOn:aStream]
ifFalse:
[aStream
nextPutAll:'ProgrammingLanguage';
nextPutAll:' named: ';
nextPutAll:self name storeString].
"
ProgrammingLanguage instance storeString
SmalltalkLanguage instance storeString
"
"Created: / 16-08-2009 / 10:52:28 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage methodsFor:'queries'!
canReadSourceFile: aFilename
"
Answers true iff file contains source code
in 'my' language
"
"Trivial implementation here, to be overriden by
subclasses"
^aFilename suffix = self sourceFileSuffix
"Created: / 16-08-2009 / 10:10:33 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage methodsFor:'testing'!
isSmalltalk
^false
"Created: / 16-08-2009 / 09:01:27 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage methodsFor:'utilities'!
fileIn: aFilename
^self sourceFileReaderClass fileIn: aFilename
"Created: / 16-08-2009 / 13:28:17 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
fileInStream: aStream
^self sourceFileReaderClass fileInStream: aStream
"Created: / 16-08-2009 / 11:05:46 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!ProgrammingLanguage class methodsFor:'documentation'!
version
^'$Id: ProgrammingLanguage.st 10467 2009-08-19 16:14:36Z vranyj1 $'
! !
ProgrammingLanguage initialize!