« first day (1596 days earlier)      last day (1584 days later) » 
00:00 - 22:0022:00 - 00:00

12:00 AM
:)
ttgtb
 
RELOAD!
[rubberduck-vba/Battleship] 3 opened issues. 2 closed issues. 1 issue comment.
[rubberduck-vba/Rubberduck] 5 commits. 2 closed issues. 5 issue comments. 461 additions. 35865 deletions.
 
Will I have to work my way down each time until I get to an annotation?
 
Work your way down?
 
5 mins ago, by IvenBach
I can do VBACodeStringParser.Parse(sourceText, t => t.startRule().module().moduleBody()); and the compiler allows me to do that since moduleBody is contained in module is contained in startRule.
The only way I see presently to get the annotations is to drill down from t => t.startRule().module().Foo(). ... Bar().annotationList() to end up with the list of annotations.
 
If you're just intending to walk the parse tree, you can just use the GetDescendents extension method.
There really isn't any "drilling down", because it's a tree. That means you need to hit all the branches.
 
12:08 AM
I'm stuck on the idea of a tree then and how to git what I want.
~.~
MDoerner gave me the suggestion:
> You could avoid all the text search based problems from my comments by looking for contexts of type VBAParser.AnnotationContext only and using the annotationArg child of the first annotationArgList child to identify the folder.
 
I'll have to look tomorrow. Heading out.
Today didn't feel very productive. Tomorrow will be better.
 
If you start from a module context, you can get all of the annotations by just calling module.GetDescendents<VBAParser.AnnotationContext>()
 
12:46 AM
If weren’t to start from a module context would it be possible to start directly with an annotations context?
 
 
4 hours later…
4:29 AM
It's out there! It's been 560 days since the first commit and I probably should have released a long time age, but goodness it feels good to get this journey started. A package manager for VBA, it seemed far-fetched at the time, but it works! #SpreadsheetDay https://twitter.com/vbablocks/status/1052746324700004358
 
5:21 AM
@Duga Need to practice atomic commits.
 
5:32 AM
[rubberduck-vba/Rubberduck] build for commit 2ee2adc6 on unknown branch: AppVeyor build failed
BUILD FAILURE!
 
Duck check: Is the @Folder annotation always folder in every language? R# was alerting me about it being culture specific and would rather check.
 
 
1 hour later…
The folder annotation is always the same, just as VBA always uses English keywords.
 
 
3 hours later…
 
1 hour later…
12:22 PM
@M.Doerner I just want to check in with you - I'm trying to fix the ghost bug with Access and I want to first rule out the possibility of a dangling COM reference preventing proper shutdown. I've been reviewing the contents of COM safe, and I'm finding that a number of GC'd SCW are coming from various commands. For example, FindAllReferencesCommand has this in its FindTarget and FindCodeTarget:
private Declaration FindCodePaneTarget()
{
    return _state.FindSelectedDeclaration(_vbe.ActiveCodePane);
}
 
@IvenBach R# is warning about some string comparison being culture-specific, because no comparer is specified. You can shut it off using a StringComparison enum parameter (use a method, not an operator), I think that will prevent matching a string like "Földer", if the user is using a culture where "ö" equates "o".
 
This seems to be missing a using. Furthermore, the FindTarget already has the _vbe.ActiveCodePane in a using. So I modified the FindCodePaneTarget to take a ICodePane parameter and moved it inside the using block declared in the FindTarget method.
 
@this that should fix it... and means the analyzers aren't picking up everything ;-)
 
There are other examples, too. FormRefactorRenameCommand has this: var component = Vbe.SelectedVBComponent; which wasn't in a using block. I thought maybe it was exempt because of the project repository but when I followed the code, I could not see it being used with the project repository implicitly, so I changed that to a using block.
Here's the original code.
In both cases, adding the using reduced the # of GC'd SCW from the COM safe.
But I remembered you telling me that not all needs to be using'd which is why I wanted to check before I go any further.
@MathieuGuindon We definitely don't have an analyzer for that use case.
We do need one.
For whatever reason, CA2000 is insufficient. :\
@this "...moved it inside..." should read "...moved the invocation of the function inside..."
 
12:42 PM
Hi! I am sure this has come up but my Google-Fu is failing. If I have an open windows explorer Save As window and I have found its handle, how do I send the file name I want to it?
Or is there a better way? For complicated reasons I am having to use SendKeys to save a pdf from internet and can get as far as this window.
Basically, I can't interact with the page via DOM as all useful stuff is in Shadow-Root so have had to resort to Chrome shortcuts.
 
Maybe consider buying a mouse-keyboard automation program? There are several and they are only $50 a license or something like that.
 
@this Is that like AutoHotKey or some such?
 
yeah
the way I see it, if you're paid $20 a hour, it makes its money in only 2.5 hours of your manual labor.
 
Ok.... Good to know for future reference. Gonna see if there is anything I can do with APIs still in meantime. If this were for me that would be fine.
 
and besides, if the site changes, the program would be easier to re-program whereas the API approach might now need to be rewritten totally
 
12:48 PM
That is very true
 
TBH I haven't really tried monkeying with a Windows Explorer API, I would imagine you'd use SetText api but what do I know.
 
I have grabbed text before from window but not set.
 
1:04 PM
@this nice!
 
Thanks. Still hasn't fixed the ghost process yet but I'm going forward on the assumption that the fix might required all those to be fixed anyway. The serialization of COM safe really helps to see where it's coming from.
 
@this There are only two cases where a disposal is not necessary. The first are rewrapped wrappers, which we use only in two places. (For these, disposal is basically a no-op.) The second are the wrappers received from the provider. These must only be disposed by the provider itself.
 
@M.Doerner OK, that is what I understood, too. I was hesitant because I remember months ago when you introduced COM safe, I flagged some, mainly in commands if I remember, as need disposing but you said those cases were not necessary. But it was so long ago and circumstances may have been different.
 
I think that were wrappers from the provider.
 
But it sounds like the examples I provided are necessary to change, so I will continue finding any other places from the serialized log to see where else may be leaking SCWs.
OK.
 
1:14 PM
Btw, we really should avoid passing along wrappers from the provider, if possible.
 
That makes sense. Keep it local. Same problem as passing it across event, really.
 
Yes, the examples require the disposal.
Nice catches!
 
To be honest, I would never have caught it without the stack trace & snapshot.
 
Then, nice tool you have built!
 
Thank you!
 
2:07 PM
morning gents!
@IvenBach do you use windows linux or OSX?
i have a DRM free copy of braid
and trine 2
 
Pretty sure he uses Windows, since he can use RD at home.
RD doesn't work on any other OS.
 
fair enough
i was going through my DRM free copies of the games he was interested in
@IvenBach it looks like i also have access to a pertttttty large library of DRM free games that includes the first trine as well, so i can get you trine 1 and 2
 
2:23 PM
@M.Doerner didn’t know. That stems from before efforts to internationalize software IE legacy code?
@KySoto windows.
Early 90s and Mac put me off on it. I should give it an honest effort to lean now.
 
so i sent you an email with like... idk 6 screen shots of hte games i can get ya
it may cover stuff you didnt think of
the games are all nice and, i just need to dump them to google drive
or dropbox, i need to recover my dropbox. somehow my password expired or something and lastpass derped up
oh, they closed it due to inactivity
eesh
oh well.
 
2:40 PM
Odd. I hadn’t used mine for 6+ years and it was still valid. I’ll check my email tonight at home.
 
ok. its gunna take a day for my google drive's space to upgrade anyway
that and for some reason i cant remote my machine right now, i assume it went to sleep
probably because i turned off my MC server
so, for now, im just going to grab trine 1 and 2, and braid for you
if you like any of the rest i saw on htere, i'll provide you with installer links
i probably could direct link you to the files, but i figure that its going to be more stable if i just give you access to the google drive folder i plan on putting them in
 
3:28 PM
Wow, the vba SO tag is really raining crap answers today...
 
@IvenBach I do not know any serious programming language that internationalizes its keywords.
I so hate it that they actually translated the function names in Excel.
 
ugh
sounds evil
 
I am never able to do anything on a German office installation.
 
@M.Doerner So the VS Code ANTLR debugger is really easy to set up, but it expects a Java compatible grammar file. Is that what you're using in Eclipse?
 
Yes
Just make the first letter of the methods in the predicates lower case.
 
3:31 PM
@M.Doerner If I write an Excel doc in an English Excel, it doesn't work in German?
Or does it store it by a universal key, and the name is just for display?
 
It does work.
Internally it is stored the same way, I think.
 
@M.Doerner I think it might be a bit deeper than than. Did you need to do anything with the regular expressions that we have evaluating via .NET?
 
Which regular expressions?
 
Anything evaluated by this header include: github.com/rubberduck-vba/Rubberduck/blob/next/…
I think rules like this might be problematic too: github.com/rubberduck-vba/Rubberduck/blob/next/…
 
You could try to change it to a Java-complient form.
 
3:43 PM
Yeah, I'm going to take a stab at that over the weekend. I just wanted to make sure I wasn't duplicating your effort first.
 
However, there is disclaimer on the github repo that predicates do not work. However, I do not know whether that is restricted to predicates using external code.
My Java grammar version is from a time when none of the two had entered the grammar.
 
Based on what I saw in the configuration, I'm guessing it's predicates using external code, but I won't be able to verify that until ANTLR stops complaining about it not being a valid grammar file.
I'm obviously still going to use it for a grammar editor, but the debugging tools would be a nice bonus.
 
does it allow you to view the parse tree without debugging?
e.g. paste in a text, parse it and see a tree?
 
You have to point it at an external file, but in theory, yes.
 
Good. In eclipse, it was possible to just paste in the text and I think I got away with only a subset of the grammar, since I was more interested in understanding the shape of the parse tree back then.
 
3:49 PM
I got it to spit the parse tree out to the debugging console once, but text representation of the parse tree needs it's own parser to read.
 
yeah, I wouldn't want to try and deconstruct a text-only representation.
that would be..... fun.
 
You can also explicitly specify a root node. Not sure exactly how useful that is though.
 
well, I mentioned subset - I would just start w/ moduleBody which allowed me to parse a single procedure (which was what I was most interested in)
had I started with module, it would yell at me about missing attributes.
 
Huh? The attributes rule matches an empty string.
 
I only remember that when I tried to start at the top level rule, it complained about missing attribute.
since I was only trying to analyze a procedure, I went for moduleBody instead and that sufficed for my need. Did not feel a need to argue with Eclipse at that time.
BTW, that was last year - I don't remember if there has been changes to the attribute rule in the intervening time.
FML
        using (var activePane = Vbe.ActiveCodePane)
        {
            if (Vbe.ActiveCodePane == null || activePane.IsWrappingNullReference)
            {
                return false;
            }

            target = _state.FindSelectedDeclaration(activePane);
        }
 
4:10 PM
Ouch.
 
IKR?
 
4:26 PM
Which in this usage is ParserRuleContext.
 
TContext is the type - that's a generic function.
It's like the T in List<T>, just with an arguably better identifier.
 
fyi as a convention, they just use T when there's only one identifier
 
but when they use more than one.... example being Dictionary<TKey, TValue>... then you should provide meaningful identifiers
else T1 or T2 get quite confusing & old.
 
Like Tuple.
 
4:29 PM
mkay. Trying to rubberduck out the correct argument to provide it.
 
@IvenBach The argument type is explicitly a ParserRuleContext. That means anything that inherits from ParserRuleContext.
 
The inheritance is good. I'm trying to supply it but every attempt I try is incorrect.
 
Gimme a sec, I'll find an example.
 
The context for which rule do you want?
 
@IvenBach This is a similar example: github.com/rubberduck-vba/Rubberduck/blob/next/…
 
4:35 PM
I'm still working on the annotations to just get @Folder.
 
I think, you do not want @Folder.
 
var callStmtContext = reference.Context.GetAncestor<VBAParser.CallStmtContext>(); is taking the ParserRuleContext in reference.Context, and finding the ancestor node of the type VBAParser.CallStmtContext.
 
You want the annotation context with annotation name Folder.
The '@` is one level too high in the tree.
 
Using your example Comintern I've var fooAnnotationList = ParserRuleContextExtensions.GetDescendents<VBAParser.AnnotationContext>(); is red lined and I'm so confused. I've confirmed AnnotationContext is a descendent of ParserRuleContext.
 
You're missing the this argument.
 
4:48 PM
I'm missing the obvious...
Isn't that <Foo>?
 
var fooAnnotationList = somevariable.GetDescendents<VBAParser.AnnotationContext>();
<Foo> is the type argument for the generic. this ParserRuleContext context is the parameter.
You can explicitly pass it with this syntax: GetDescendents<VBAParser.AnnotationContext>(somevariable);
Or you can use the extension method syntax: somevariable.GetDescendents<VBAParser.AnnotationContext>();
Those 2 lines of code are functionally identical.
That's what the this keyword means in the signature - it implicitly passes the object it's being called on as the parameter context. Just syntactic sugar.
 
the someVariable needs to be of type ParserRuleContext. That's what I need to understand right now.
 
@Comintern Please note the affixed warning from General Surgeon -- too much sugar can lead to diabetics, cancer, obesity in your code.
@IvenBach be also aware that there are type constraint, too. I don't know if ANTLR makes use of them, though. In fact that'd be another reason to not use T as the identifier since it won't communicate any constraints that may be placed upon the generic type.
 
@this Please note the affixed warning from Def Leppard -- pour some sugar on me.
2
 
You will have to cast the IParseTree you have to ParserRuleContext.
 
4:56 PM
@this constrained by the code where TContext : ParserRuleContext.
 
yeah
 
@M.Doerner :click: That's what I couldn't figure out myself.
 
so using T would have been a bad name in this context. TContext reminds you it wants to be some certain type.
 
Forgive me if it seems like I'm continually asking for handouts on this. I'm add my thought process and what I'm attempting to show I'm putting in effort to figure it out. It's just #ThisIsHard for me being new to all this.
I appreciate the patience.
 
That you have to do the cast is really annoying and confusing.
 
5:00 PM
wouldn't it be done implicitly?
 
Not that one.
 
However, the IParseTree interface is missing some crucial members if you want to traverse the tree yourself.
 
what? Sheesh.
 
Overload?
 
It is a cast interface -> concrete class.
I think the children collection is not on the IParseTree interface.
 
5:02 PM
IIR there were a couple other things that aren't there.
 
It is basically enforcing that you should use a listener or visitor.
 
Overloads like this might be convenient:
public static IEnumerable<TContext> GetDescendents<TContext>(this IParseTree tree) where TContext : ParserRuleContext
{
	return GetDescendents<TContext>((ParserRuleContext)tree);
}
 
IIRC children is an exposed public field, which I believe means it's not impossible that it becomes private and left unexposed in future versions.
that would suck big time though
 
5:17 PM
Trying the cast ((VBAParser.AnnotationContext)result.parseTree).GetDescedents<...> barfs with an error.
2018-10-19 10:16:40.5807;ERROR-2.2.6866.18430;Rubberduck.UI.CodeExplorer.Commands.ImportCommand;System.InvalidCastException: Unable to cast object of type 'StartRuleContext' to type 'AnnotationContext'.
   at Rubberduck.UI.CodeExplorer.Commands.ImportCommand.OnExecute(Object parameter) in C:\Users\cpaustell\Source\Repos\Rubberduck\Rubberduck.Core\UI\CodeExplorer\Commands\ImportCommand.cs:line 104
   at Rubberduck.UI.Command.CommandBase.Execute(Object parameter) in C:\Users\cpaustell\Source\Repos\Rubberduck\Rubberduck.Core\UI\Command\CommandBase.cs:line 47;System.InvalidCastException: Unable
 
What is the type of result?
 
The tuple (IParseTree parseTree, TokenStreamRewriter rewriter) coming from Parse
Converting it to var fooAnnotationList = result.parseTree.GetDescendents<VBAParser.AnnotationContext>();
Error CS1929 'IParseTree' does not contain a definition for 'GetDescendents' and the best extension method overload 'ParserRuleContextExtensions.GetDescendents<VBAParser.AnnotationContext>(ParserR‌​uleContext)' requires a receiver of type 'ParserRuleContext'
 
@MathieuGuindon / @M.Doerner / @Comintern I hate to ask but if any of you could give the serialize PR a quick look over just to be sure I have not missed any more boneheaded mistakes, I would appreciate that. :)
 
You're casting the wrong thing: (VBAParser.AnnotationContext)(result.parseTree)
@this I should have time to give it a quick scan at some point today.
 
I am looking at the lexer grammar in VS Code right now. I already found a number of stupid redundancies.
 
5:23 PM
Thanks!
 
I can believe it.
 
@Hosch250 that it's not butter?
 
Oh man, no, it's not butter.
 
@Comintern var fooAnnotationList = (VBAParser.AnnotationContext)result.parseTree.GetDescendents<VBAParser.Annotatio‌​nContext>(); produces an error as well.
as does (VBAParser.AnnotationContext)(result.parseTree)
I think VS is marking the parenthesis as redundant too.
 
I'm not too happy with the SCP code itself (it's kinda messy), but I haven't hit any showstoppers... if y'all ok with it I'm good with merging.
 
5:27 PM
I'm good, but then, I've not used it, and won't need to :)
 
Although... I tried to refactor into smaller, cleaner methods, but broke something every time... that's kind of a bad omen.
2
 
tbh it's hard to visualize the SCP just by looking at the code. I think you'll get more feedback once merged and hopefully that helps get you over the roadblock at the present.
the important thing is that killswitch actually works, yes? ;-)
 
@IvenBach You want to cast the IParseTree to ParserRuleContext.
The underlying object is of the concrete type corresponding to the parser rule you used to generate the tree.
Moreover, the cast scoping is always the result of everything to the right.
You need parentheses around the cast.
 
^ IOW, (somethingElse)something casts the something to somethingElse
 
((ParserRuleContext)result.parseTree).Whatever
calls whatever after the cast
(ParserRuleContext)(result.parseTree).Whatever
 
5:39 PM
@MathieuGuindon I'm with @this on that. I'm good with merging too - it will help identify anything else that needs to be addressed (that's what pre-release is for).
 
casts the result of result.parseTree.Whatever.
 
@M.Doerner It casts it to ParserRuleContext?
 
Just one more thing - SCP should probably ship disabled by default (if that's not the case already in this PR).
 
Yes, provided it succeeds.
To execute the extension method, you have to cast before calling.
 
var fooAnnotationList = (Antlr4.Runtime.ParserRuleContext)(result.parseTree).GetDescendents<VBAParser.An‌​notationContext>(); has a compile time error whereas var fooAnnotationList = ParserRuleContextExtensions.GetDescendents<VBAParser.AnnotationContext>((Antlr4.‌​Runtime.ParserRuleContext)(result.parseTree)); doesn't.
Testing with second version to see if it throws an error.
 
5:44 PM
You are missing the parentheses around the cast in the first version.
 
Hmm I think there are a couple review comments from @Vogel612 that I haven't addressed yet. Not sure what to do about the null-return though - the basic mechanics of it is that it either returns a CodeString with the new info, or null in which case the service knows to let the keypress through
 
The opening parenthesis should not be in front of result, but in front of the opening parenthesis of the cast.
 
as in var fooAnnotationList = ((Antlr4.Runtime.ParserRuleContext)(result.parseTree)).GetDescendents<VBAParser.‌​AnnotationContext>();?
:hang-head: error isn't there now.
 
Yes, but the parentheses around result.parseTree are redundant.
cast scoping is confusing
 
It's not just me then #Whew.
 
5:49 PM
I made that mistake so many times...
 
@MathieuGuindon I'm not sure I agree that the mechanics there are wrong. Returning null for a "failed" request is a common enough idiom that I don't think is makes sense to change it. I'm also not sure how else you would accomplish that without introducing state somewhere it arguably wouldn't belong.
 
okay I'm finally unpacking the boxes from moving ...
@Comintern the usual solution in C# is to use the Try* idiom
 
don't they say it's very expensive to try?
 
less expensive than to throw
especially in that particular codepath
 
ok but Try* would return a bool, right?
 
5:53 PM
aye
 
Wouldn't a TryComplete or similar just kick the test down the stack a bit?
 
so that means the CodeString return value would have to become a ref parameter
or out, actually
 
@Comintern depends. either you kick the Try idiom down the callstack or you kick the nullckecks down the stack
and I'd generally prefer the try idiom
 
i don't follow - if you create a Try* method, it implies it's doing a try/catch which may throw within the method (and return null in the ref and false as the result)?
 
@this no.
 
5:54 PM
Right, that makes sense. But at the end of the day, you're still checking the out parameter to see if it's null.
 
^
well no
 
Just because it has try in the name, it's not necessarily related to the try keyword
 
you only need to check the bool result, and consume the ref/out parameter
 
I take that back. You test the condition, and only use it if it's non-null.
 
5:56 PM
there you go
 
still not seeing the benefit - if it's without the try block, why even have a Try* to begin with?
 
and strictly speaking the out param can not be uninitialized
@this replaces nullchecks by the cleaner and shorter following:
if (TryCompute(out var value))
{
    // value is initialized and usable
}
else
{
    // value is not in scope (and would've been unusable)
}
 
and Assert.Is[Not]Null(result); becomes Assert.Is[True|False](result); in 50 places :)
 
Sure, but is it worth the extra function (and therefore a stack frame)?
 
there is no extra function
the try function replaces the current implementation
 
5:59 PM
ah, i thought it was replacing if(foo != null)
ignore me, then.
 
nah, that's just hiding the null-handling.
 
so public abstract CodeString Handle(AutoCompleteEventArgs e, AutoCompleteSettings settings); needs to become public abstract bool TryHandle(AutoCompleteEventArgs e, AutoCompleteSettings settings, out CodeString result);
 
you could inject the settings at the ctor, right?
 
Come on VS, why don't you rebuild projects depending on Parsing when rebuilding Parsing?
 
I don't want the whole user settings, just what the current AC config is...
the AC handler gets the settings in ctor and uses it to know whether or not to handle things
it's also handling SettingsChanged
ctor-injecting at that level would mean handling SettingsChanged in both the SCP and the upcoming block-completion handlers
...which would be redundant
 
6:08 PM
^ Yeah, I don't think that's necessary.
What settings do you need in the CodeString?
 
I don't need settings in the codestring
 
Oh wait - that's the handler.
 
actually I'm not using any settings in the SCP handler, and the smart-concat handler only uses them to know whether or not to bail out (for now) ...I think I can eliminate the parameter.
although, it'll probably end up being re-added when more SCP options are added
but yeah right now it's YAGNI
also, about settings - should I clean up the old block-completion settings (which are currently no-op) now, or do that in the block-completion PR (which will need settings)?
the settings page for AC is confusing AF right now
 
Leave them in the settings and remove the UI?
 
I'll do that
that way the settings page for AC will be somewhat consistent with what's currently implemented & functional
basically, 1) the master killswitch, 2) SCP killswitch, 3) smart-concat killswitch... and that's all
are we ok with hard-coding the SelfClosingPair instances?
it's not like they really need to be configurable in any way... right?
 
6:20 PM
I don't see why we wouldn't.
 
private static readonly IEnumerable<SelfClosingPair> SelfClosingPairs = new List<SelfClosingPair>
{
    new SelfClosingPair('(', ')'),
    new SelfClosingPair('"', '"'),
    new SelfClosingPair('[', ']'),
    new SelfClosingPair('{', '}'),
};
 
It's not like I could define, say a Hungarian SCP for obj|Object.
 
adding new SelfClosingPair('<', '>') could be funny annoying
maybe new SelfClosingPair('#', '#') could come into existence, in very specific contexts
I can't think of any others
 
I could see the date literal one. Not that I' ever use them, but some people do.
 
then again, the risk of getting it wrong, vs the benefit of getting it right... doesn't balance out IMO
Open path For Output As #|AGH DAMMIT#
2
 
6:29 PM
#if DEBUG#
#endif#
 
#SoManyWaysToBlowThis#
 
LOL
 
7:01 PM
Using the correct tools for the job makes it a lot simpler.
Attribute VB_Name = "Module1"
'@Folder( Foo )
Option Explicit

Public Sub PrintTest()
	'@Folder(JustAComment)
    Debug.Print "Test"
End Sub
becomes
'@Folder( VBAProject )
Option Explicit

Public Sub PrintTest()
        '@Folder(JustAComment)
    Debug.Print "Test"
End Sub
Is there a list of valid annotations? I'd like to test some scenarios where '@Folder isn't the first annotation on the line.
 
@IvenBach they're enums
look into AnnotationFactory (or something like it)
the recognized annotation names are {enum}.ToString()
 
hmm that [AttributeAnnotation] is a relic of a failed feature
 
7:27 PM
Duck check: should I take into consideration when module declarations don't exist?
:duh: Of course I should.
 
8:14 PM
Does the # optionExplicit at the end of the line cause that statement to be created? I'm unable to find a formally defined.
 
@IvenBach That's defined in the lexer.
 
OPTION_EXPLICIT : O P T I O N (WS | LINE_CONTINUATION)+ E X P L I C I T; is
What about OptionExplicitStmtContext?
When I go to the definition its within VBAParser
 
Ah - misunderstood the question there. Yes, # optionExplicit is a label for the rule.
 
mkay
 
8:29 PM
Think of it like an alias.
The moduleOption has 4 options it can match (pun not intended). The labels allow you to refer to those specific matches instead of only "moduleOption".
 
fine grain control.
 
8:45 PM
> Closing this as possible further enhancements are not detailed in this ticket, and the main work is done. Other enhancements can be brought up after the feature has been in use.
 
8:57 PM
@all there’s a new feature in Github for programmers to make suggestions in code... could be useful. twitter.com/github/status/1053360435074949120?s=21
 
9:35 PM
<~ broke production website at 5:15pm on a Friday just as boss was walking out the door
I hate MySQL... and stupid databases that don't have dupe-preventing keys/constraints
fixed, TTQW
 
@MathieuGuindon are they using an ancient version of MySQL or what? AIUI, recent versions default to InnoDB, which do enforce FKs.
 
Problem wasn't FK
missing NK
that's what you get for making consistently idiot-proof databases: you don't get to get away with being an idiot with other people's databases
 
ah, so it's just a key-value store, then.
 
main problem being that the test db is an old version with a different schema
had to test in prod
 
don't you feel like a cowboy!
 
9:45 PM
lol
 
@M.Doerner so I'm looking at this other path which is coming up a lot as being GC'd from the COM safe...
        public bool IsDirty()
        {
            foreach (var project in Projects)
            {
                try
                {
                    foreach (var component in project.VBComponents)
                    {
                        if (IsNewOrModified(component))
                        {
                            return true;
                        }
                    }
                }
                catch (COMException)
                {
                }
            }
the Projects comes from the projectsProvider, and that is not the problem.
However, the problem is with the component in the foreach (and maybe the VBComponents, too.
Is there a reason why we can't use _projectsProvider.ComponentsCollection instead of project.VBComponents?
(this is in RPS, btw)
 
@this I don't think that would work - doesn't that skip the moduleState.IsNew case?
 
00:00 - 22:0022:00 - 00:00

« first day (1596 days earlier)      last day (1584 days later) »