Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Update code generator to handle generic types and types with multiple '+' signs in them. - #102

Merged
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen
May 11, 2018
Merged

Update code generator to handle generic types and types with multiple '+' signs in them.#102
yaeldekel merged 7 commits into
dotnet:masterfrom
yaeldekel:codegen

Conversation

@yaeldekel

@yaeldekelyaeldekel commented May 9, 2018

Copy link
Copy Markdown

The C# code generator needs to be able to handle types that are nested inside generic classes. It should also handle types that are nested in nested classes.

@yaeldekel

Copy link
Copy Markdown
Author

Fixes #101

@yaeldekel
yaeldekel requested review from codemzs and eerhardtMay 9, 2018 18:11
}

static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, string fullTypeName, string currentNamespace)
static string GetSymbolFromType(Dictionary<string, string> typesSymbolTable, Type type, string currentNamespace)

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static [](start = 8, length = 6)

While we're at it let's add an explicit access modifier... #Closed

{
Contracts.AssertValue(genericTypes);
fullTypeName = fullTypeName.Substring(0, bracketIndex);
}

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is some fairly elaborate string manipulation going on, the utility of which will be opaque to anyone not intimately familiar with how the .NET class naming system works, and that also does not understand the specific issues raised in issue #101 that requires its introduction. #Resolved

@veikkoeevaveikkoeevaMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a feeling this is more complicated. For comparison, there's a similar case (maybe not exactly, but anyway): https://github.com/dotnet/orleans/blob/master/src/AdoNet/Orleans.Persistence.AdoNet/Storage/Provider/AdoNetGrainStorage.cs#L506. More laborius, but might be usable to extract this to a separate class/function and test a bit more. This is something that probably should be done in Orleans too, since there are similar needs. :)

Also perhaps interesting in case there's a possibility to refactor out commonalities and have a joint library: https://github.com/dotnet/orleans/blob/e78c7fa4ae302808ed30d71ebc14f1ef544a923e/src/Orleans.Core/AssemblyLoader/AssemblyLoader.cs. #Resolved

@yaeldekelyaeldekelMay 10, 2018

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Veikko, thanks for your suggestion and for the reference. This method definitely doesn't handle every possible case for a type name (for example, it does not handle the case where the nested class is also generic). Since it is a private method, I think that would be enough for handle the cases we need it to handle. I did add some comments though, to make it easier to handle new cases if the need arises. #Resolved

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be tempted to insert a link though to the MSDN docs for this at the GetType, since we're attempting to read a (subset) of the language. Plus maybe document the limitations of this method.

Edit: um I'm blind, I see you already did that. :P


In reply to: 187414843 [](ancestors = 187414843)

private static class Mkl
{
private const string DllName = "Microsoft.ML.MklImports.dll";
private const string DllName = "Microsoft.MachineLearning.MklImports.dll";

@TomFinleyTomFinleyMay 9, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Microsoft.MachineLearning [](start = 44, length = 25)

Is this related to the issue raised?

Given that we decided on Microsoft.ML vs. the more verbose Microsoft.MachineLearning, should not that DLL change its name, rather than the other way around? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had the same question but I also feel this should be made as a separate change and we should open an issue for this.


In reply to: 187159434 [](ancestors = 187159434)

int backTickIndex = baseName.LastIndexOf('`');
int dotIndex = baseName.LastIndexOf('.');
if (backTickIndex < 0)
name += baseName.Substring(dotIndex + 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name += baseName.Substring(dotIndex + 1); [](start = 15, length = 42)

Can dotindex be -1?

@TomFinleyTomFinleyMay 10, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it somehow cannot be (e.g., I might expect that everything would at least have a namespace), we should add a nice little Contracts.Assert to document that..


In reply to: 187485225 [](ancestors = 187485225)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not, because the full name always begins with the namespace.


In reply to: 187485225 [](ancestors = 187485225)

name += string.Join("", splitNames);
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks for doing this. May be put an example of how a name is generated from this control flow.


name += fullTypeName.Substring(fullTypeName.LastIndexOf(dim) + 1); ;
for (int i = 1; i < nestedNames.Length; i++)
name += nestedNames[i];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming you are adding this to have unique names but I feel these names should go before the generated name and is it possible to only add them when we detect there is a name collision? We add them as needed and if we run out of them then we can add rolling numbers.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added an example in the XML comment.


In reply to: 187485666 [](ancestors = 187485666)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yaeldekel for fixing code generation for these types.

@glebukglebuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@yaeldekel
yaeldekel merged commit 2e732ea into dotnet:masterMay 11, 2018
@yaeldekel
yaeldekel deleted the codegen branch May 11, 2018 15:39
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request May 11, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
… '+' signs in them. (dotnet#102)
* Handle generic types and types with multiple '+' signs in them.
* Delete commented code.
* Address PR comments.
* Skip codegen unit test.
* Add example to comment.
* Assert that the full type name has a dot in it.
* Trigger build.
@ghostghost locked as resolved and limited conversation to collaborators Mar 31, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@yaeldekel@codemzs@veikkoeeva@TomFinley@glebuk@yaeldMS