ProgrammingLanguage.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 25 Feb 2010 22:58:21 +0000
branchjv
changeset 17753 e565afc91253
parent 17736 26cfea63471d
child 17761 b0e5971141bc
permissions -rw-r--r--
- added EncodedStream>>reset and EncodedStream>>contents (SmallRuby compiler uses that) - fix ProgrammingLanguage class >>forStream: to work with EncodedStream

"{ Package: 'stx:libbasic' }"

Object subclass:#ProgrammingLanguage
	instanceVariableNames:''
	classVariableNames:'LanguageQuerySignal'
	poolDictionaries:''
	category:'Kernel-Languages'
!

ProgrammingLanguage class instanceVariableNames:'Instance'

"
 No other class instance variables are inherited by this class.
"
!

!ProgrammingLanguage class methodsFor:'documentation'!

documentation
"
    provide info about which tools are to be used for code in
    a programming language
"
! !

!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)"

    "JV: yet another kludge, sigh"
    (aStream isKindOf: EncodedStream) 
        ifTrue: [ ^ self forStream: aStream stream ].

    aStream isFileStream 
        ifFalse: [ ^ SmalltalkLanguage instance ].

    ^ self forFile: aStream fileName

    "Created: / 16-08-2009 / 10:56:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
    "Modified: / 25-02-2010 / 23:26:20 / Jan Vrany <jan.vrany@fit.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>"
!

named: aString ifNone: aBlock
    ^ self 
        instancesDetect:[:each | each name = aString ]
        ifNone: aBlock

    "Created: / 21-08-2009 / 13:07:10 / 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
    "return this languages singleton"

    Instance ifNil:[Instance := self new].
    ^Instance

    "Created: / 16-08-2009 / 10:36:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !

!ProgrammingLanguage class methodsFor:'enumerating'!

allDetect:aBlock ifNone:exceptionValue
    self allDo:[:each | (aBlock value:each) ifTrue:[^ each]].
    ^ exceptionValue value
!

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 class methodsFor:'testing'!

isAvailable: langName

    self instancesDetect: [:lang|lang name = langName] ifNone: [^false].
    ^true

    "
        ProgrammingLanguage isAvailable: 'Smalltalk' 
        ProgrammingLanguage isAvailable: 'Ruby'  
        ProgrammingLanguage isAvailable: 'Haskell'   
    "

    "Created: / 21-08-2009 / 12:56: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', etc."

    ^self subclassResponsibility

    "Created: / 16-08-2009 / 10:42:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !

!ProgrammingLanguage methodsFor:'accessing - classes'!

compilerClass
    "Answer a class suitable for compiling a source code in 'my' language"

    ^self subclassResponsibility

    "Created: / 21-08-2009 / 13:00:50 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

evaluatorClass
    "Answer a class suitable for evaluating a doIt in 'my' language"

    ^ self compilerClass
!

explainerClass
    "Answers a class used by browser and debugger to
     show some hints about the code. It is OK to return
     nil, which means that there is no explainer for given
     language."

    "return nil by default"
    ^nil

    "Created: / 21-08-2009 / 08:49:13 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

formatterClass
    "Answer a class suitable for prettyPrinting (indenting) code in 'my' language.
     It is ok to return nil, which means that the browser will not be able to prettyprint."

    ^ nil
!

parserClass
    "Answer a class suitable for parsing a source code in 'my' language"

    ^self subclassResponsibility

    "Created: / 21-08-2009 / 13:00:30 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

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>"
!

syntaxHighlighterClass
    "Answers a class used by browser and debugger to colorze code.
     It is OK to return nil, which means that the code is shown as-is"

    "return nil by default"
    ^nil
! !

!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'!

isRuby
    "true iff this is the ruby language"

    ^ false
!

isSTXJavaScript
    "true iff this is the ST/X-javascript language"

    ^ false
!

isSmalltalk
    "true iff this is the smalltalk language"

    ^ false

    "Created: / 16-08-2009 / 09:01:27 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !

!ProgrammingLanguage methodsFor:'utilities - file in/file out'!

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 methodsFor:'utilities - source code'!

methodTemplate
    "return a method definition template string (or nil)"

    ^ nil
!

writeComment:aStringOrStringCollection on:aStream 
    "Utility method - writes a comment to a stream,
     using proper syntax"
    
    ^ self sourceFileWriterClass new 
        fileOutComment: aStringOrStringCollection
        on: aStream

    "Created: / 21-08-2009 / 09:35:07 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !

!ProgrammingLanguage class methodsFor:'documentation'!

version
    ^ '$Id: ProgrammingLanguage.st 10503 2010-02-25 22:58:21Z vranyj1 $'
!

version_CVS
    ^ '§Header: /cvs/stx/stx/libbasic/ProgrammingLanguage.st,v 1.10 2009/12/04 11:21:32 cg Exp §'
!

version_SVN
    ^ '$Id: ProgrammingLanguage.st 10503 2010-02-25 22:58:21Z vranyj1 $'
! !

ProgrammingLanguage initialize!