On 14 Mar 2017, at 11:23, Raffaello Giulietti <raffaello.giulietti@lifeware.ch> wrote:
Hi,
I'm wondering how to programmatically compile a method. I tried using a variant of ClassDescription>>compile:*:notifying:
Yes, this is the Smalltalk API. You can use the compiler directly and then install the method yourself, too. The compiler has a number of setters and then a build method (#compile if you are interested in a compiled method). OpalCompiler new class: Object; source: âfoo ^1â; compile. or, if you compile for a class the class can give a pre-setup compiler: Object compiler source: 'foo ^1'; compile. then you can install the method with addSelector:withMethod:
However, on a method with undeclared variables, when the Transcript is open there seems to be no way to avoid a message being written there. Further, the requestor passed as a notifier in the above method is not even notified when the compilation context is not interactive.
Yes, this is sadly right now hard-coded⦠but in the Exception. So you can do what the exception does yourself: method := [Object compiler source: 'foo ^a'; compile] on: OCUndeclaredVariableWarning do: [ :ex | | varName | varName := (ex instVarNamed: #node) name. Undeclared at: varName asSymbol put: nil. ex resume: (OCUndeclaredVariable new name: varName asSymbol). ].
What is the correct way to use the compiler programmatically and in a non interactive batch, still being able to catch all the compilation errors and warnings?
What we need for the future is to have not just logging but real compiler error objects⦠there are other cases where it would be nice (e.g. to get a list of all errors after loading a package with monticello). We should improve the compiler for Pharo7⦠Marcus